簡體   English   中英

將數據從一個協議發送到另一個協議中?

[英]Sending data from one Protocol to another Protocol in 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()

有什么想法嗎? :-)

常見問題解答

如何在一個連接上輸入結果而在另一個連接上輸出結果?

這似乎是一個扭曲的問題,但實際上是一個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() 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM