在Twisted中将数据从一个协议发送到另一个协议?

时间:2010-04-14 02:23:20

标签: python twisted

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

我需要从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()

有什么想法吗? : - )

1 个答案:

答案 0 :(得分:4)

扭曲FAQ

  

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

     

这似乎是扭曲的   问题,但实际上它是一个Python   题。每个Protocol对象   代表一个连接;您可以   调用它的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()