2010-04-14 5 views
2

Один из моих протоколов подключен к серверу, и с выходом этого я хотел бы отправить его другому протоколу.Отправка данных из одного протокола в другой протокол в Twisted?

Мне нужно получить доступ к методу 'Сообщ' в ClassA из ClassB, но я получаю: 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() 

Любые идеи, пожалуйста? :-)

+0

Вы можете вставить фактический код? Идеально минимальный нерабочий пример. Как есть, может быть полдюжины причин, почему это не работает. – moshez

+0

извините - http://pastebin.com/MQPhduSY – veb

+1

Вы также можете отправить сообщение об ошибке? – zoli2k

ответ

4

Twisted FAQ:

Как мне сделать вход на одно соединение результат на выходе на другой?

Это кажется, что это Twisted вопрос, но на самом деле это 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() 
Смежные вопросы