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

1

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

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

Я хотел бы знать, как с объекта вроде:

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

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

self.protocol.dupa1 (MSG)

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

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

Теги:
twisted
xmpp
irc

3 ответа

5

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

Я использовал глобальный для хранения выходного соединения 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

Об этом говорится в FAQ.

http://twistedmatrix.com/trac/wiki/FrequentlyAskedQuestions#HowdoImakeinputononeconnectionresultinoutputonanother

  • 0
    Нет. Этот пример читается со всех, пишите всем. Оригинальный постер (и я) ищем «читать из группы», писать в «другую группу».
  • 1
    Только «нет» в том смысле, что это не точная реализация того, что хочет плакат. Это пример, это не решение. Посмотрите на это и учитесь на этом. Разве вы не видите, как можно заменить цикл для всех клиентов другими критериями выбора?
Показать ещё 3 комментария
1

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

  • 0
    Я думаю, это не решает мою проблему - то, что делает этот пример, отправляет сообщение каждому подключенному клиенту в диапазоне одного протокола. То, что я пытаюсь сделать, это получить текстовую строку на каком-либо порту, а затем передать ее двум или более различным протоколам, где она может быть обработана в соответствии с определенными протоколами методами при получении сообщения - как вставка полученной строки в канал IRC. , отправка через xmpp клиентам jabber и так далее.
  • 0
    Поэтому вам нужно будет сделать то же, что и в примере, с точки зрения отслеживания подключенных клиентов (по каждому протоколу), но также добавить некоторый объект более высокого уровня, который отслеживает все из них. Это может быть Service вами Service , которая содержит ссылку на ваши фабрики irc и nagios и передает им сообщения.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню