Twisted - как создать многопротокольный процесс и передавать данные между протоколами - PullRequest
1 голос
/ 26 марта 2010

Я пытаюсь написать программу, которая будет прослушивать данные (простые текстовые сообщения) через некоторый порт (скажем, tcp 6666), а затем передавать их одному или нескольким различным протоколам - irc, xmpp и так далее. Я перепробовал много подходов и покопался в интернете, но не могу найти простое и работающее решение для такой задачи.

Код, с которым я сейчас борюсь, находится здесь: http://pastebin.com/ri7caXih

Я хотел бы знать, как из объекта, как:

ircf = ircFactory ('asdfasdf', '# asdf666')

получить доступ к методам самостоятельного протокола, потому что это:

self.protocol.dupa1 (МСГ)

возвращает ошибку о том, что self не передается в активный объект протокола. Или, может быть, есть другой, лучший, более простой и более кошерный способ создания одного реактора с несколькими протоколами и действиями, запускаемыми при поступлении сообщения на любой из них, а затем передачей этого сообщения другим протоколам для обработки / обработки / отправки?

Любая помощь будет высоко оценена!

Ответы [ 3 ]

5 голосов
/ 03 мая 2011

Вот пример кода для чтения из нескольких подключений к порту 9001 и записи в подключение к порту 9000. Вам потребуется несколько реализаций "PutLine", одна для XMPP, IRC, MSN и т. Д.

Я использовал global для хранения выходного соединения PutLine, но вы бы хотели создать более сложный объект Factory, который бы обрабатывал это вместо этого.

#!/usr/bin/env python

from twisted.internet.protocol import Protocol, Factory
from twisted.internet.endpoints import clientFromString, serverFromString
from twisted.protocols.basic import LineReceiver
from twisted.internet import reactor

queue = []
putter = None

class GetLine(LineReceiver):
    delimiter = '\n'

    def lineReceived(self, line):
        queue.append(line)
        putter.have_data()
        self.sendLine(line)

class PutLine(LineReceiver):
    def __init__(self):
        global putter
        putter = self
        print 'putline init called %s' % str(self)

    def have_data(self):
        line = queue.pop()
        self.sendLine(line)


def main():
    f = Factory()
    f.protocol = PutLine
    endpoint = clientFromString(reactor, "tcp:host=localhost:port=9000")
    endpoint.connect(f)
    f = Factory()
    f.protocol = GetLine
    endpoint2 = serverFromString(reactor, "tcp:port=9001")
    endpoint2.listen(f)
    reactor.run()

if __name__ == '__main__':
    main()

Тестирование:

nc -l  9000
python test.py
nc 9001

Данные, введенные из любого номера nc 9001 (или netcat 9001), появятся в nc -l 9000.

3 голосов
/ 27 марта 2010
1 голос
/ 26 марта 2010

См. doc/core/examples/chatserver.py. Там они добавили хуки в методы Protocol connectionMade и connectionLost для ведения списка подключенных клиентов, а затем он проходит по всем из них, когда приходит сообщение для передачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...