【问题标题】:Sending data from one Protocol to another Protocol in Twisted?在 Twisted 中将数据从一个协议发送到另一个协议?
【发布时间】:2010-04-14 02:23:19
【问题描述】:

我的一个协议连接到服务器,并且我想将其输出发送到另一个协议。

我需要从 ClassB 访问 ClassA 中的“msg”方法,但我不断收到:exceptions.AttributeError: 'NoneType' object has no attribute 'write'

实际代码:

from twisted.words.protocols import irc
from twisted.internet import protocol
from twisted.internet.protocol import Protocol, ClientFactory
from twisted.internet import reactor

IRC_USERNAME = 'xxx'
IRC_CHANNEL = '#xxx'
T_USERNAME = 'xxx'
T_PASSWORD = md5.new('xxx').hexdigest()

class ircBot(irc.IRCClient):
    def _get_nickname(self):
        return self.factory.nickname

    nickname = property(_get_nickname)

    def signedOn(self):
        self.join(self.factory.channel)
        print "Signed on as %s." % (self.nickname,)

    def joined(self, channel):
        print "Joined %s." % (channel,)

    def privmsg(self, user, channel, msg):
        if not user:
                return

        who = "%s: " % (user.split('!', 1)[0], )
        print "%s %s" % (who, msg)

class ircBotFactory(protocol.ClientFactory):
    protocol = ircBot

    def __init__(self, channel, nickname=IRC_USERNAME):
        self.channel = channel
        self.nickname = nickname

    def clientConnectionLost(self, connector, reason):
        print "Lost connection (%s), reconnecting." % (reason,)
        connector.connect()

    def clientConnectionFailed(self, connector, reason):
        print "Could not connect: %s" % (reason,)

class SomeTClass(Protocol):
    def dataReceived(self, data):
        if data.startswith('SAY'):
                data = data.split(';', 1)
                # RAGE
                #return self.ircClient.msg(IRC_CHANNEL, 'test')

    def connectionMade(self):
        self.transport.write("mlogin %s %s\n" % (T_USERNAME, T_PASSWORD))

class tClientFactory(ClientFactory):
    def startedConnecting(self, connector):
        print 'Started to connect.'

    def buildProtocol(self, addr):
        print 'Connected.'
        return t()

    def clientConnectionLost(self, connector, reason):
        print 'Lost connection.  Reason:', reason

    def clientConnectionFailed(self, connector, reason):
        print 'Connection failed. Reason:', reason

if __name__ == "__main__":
    #chan = sys.argv[1]
    reactor.connectTCP('xxx', 6667, ircBotFactory(IRC_CHANNEL) )
    reactor.connectTCP('xxx', 20184, tClientFactory() )
    reactor.run()

有什么想法吗? :-)

【问题讨论】:

  • 你能粘贴实际代码吗?理想情况下是一个最小的非工作示例。事实上,它不起作用的原因可能有六种。
  • 对不起 - pastebin.com/MQPhduSY
  • 你也可以发布完整的错误信息吗?
  • 从外观上看,这仍然不是一个有效的示例。你有一个名为 Toribash 的协议,你没有在任何地方引用它,并且有一个函数 t() 似乎是未定义的。

标签: python twisted


【解决方案1】:

扭曲FAQ

如何在一个连接上进行输入 导致另一个输出?

这似乎是一个扭曲 问题,但实际上它是一个 Python 问题。每个协议对象 代表一个连接;你可以 调用它的 transport.write 来写一些 数据给它。这些是常规的 Python 物体;您可以将它们放入列表中, 字典或任何其他数据 结构适合您的 应用程序。

作为一个简单的例子,添加一个列表到 你的工厂,在你的协议中 connectionMade 和 connectionLost,添加 并将其从该列表中删除。 这是 Python 代码:

from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor

class MultiEcho(Protocol):
    def connectionMade(self):
        self.factory.echoers.append(self)
    def dataReceived(self, data):
        for echoer in self.factory.echoers:
            echoer.transport.write(data)
    def connectionLost(self, reason):
        self.factory.echoers.remove(self)

class MultiEchoFactory(Factory):
    protocol = MultiEcho
    def __init__(self):
        self.echoers = []

reactor.listenTCP(4321, MultiEchoFactory())
reactor.run()

【讨论】:

    猜你喜欢
    • 2018-11-30
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多