2010-03-26 4 views
1

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

код я в настоящее время борьба с здесь: http://pastebin.com/ri7caXih

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

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

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

self.protocol.dupa1 (МСГ)

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

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

ответ

1

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

+0

Я думаю, это не решает мою проблему - что делает этот пример, отправляет сообщение каждому подключенному клиенту в диапазоне одного протокола. То, что я пытаюсь сделать, - это получить текстовую строку на каком-то порту, а затем передать ее двум или более различным протоколам, где она может обрабатываться в соответствии с определенными протоколами при получении сообщения - например, вставить полученную строку в канал irc , отправка через xmpp для jabber-клиентов и т. д. – SpankMe

+0

Таким образом, вам нужно будет сделать то, что делает этот пример, с точки зрения отслеживания подключенных клиентов (по каждому протоколу), но также добавить некоторый объект более высокого уровня, который отслеживает все те из них. Это может быть созданная вами «Служба», которая содержит ссылки на ваши фабрики 'irc' и' nagios' и передает им сообщения. – keturn

+0

Ну, кажется, я просто не объясняю проблему. Этот код предназначен для прослушивания на порту 6666 и в то же время вошел в систему irc (на данный момент отбрасывает jabber) в качестве бота, который отправит сообщение, полученное на порт 6666, на канал irc, который он войдет в систему.Это не проблема отправки сообщений между несколькими клиентами в одном протоколе, а передача данных между двумя (или более) независимыми протоколами/фабриками. Надеюсь, это поможет понять проблему, стоящую за кодом. – SpankMe

3
+0

Нет. Этот пример читается из всех, пишите всем. Оригинальный плакат (и я) ищут «читать из кучки», пишут в «другую группу». –

+1

Только «нет» в том, что это не точная реализация того, что хочет плакат. Это пример, это не решение. Посмотрите на это и учитесь на нем. Разве вы не видите, как вы можете заменить цикл на всех клиентов некоторыми другими критериями выбора? –

+0

Еще нет. Вам нужно подключиться из протокола к другому. В этом примере показано, как переписать протокол. Вы действительно проголосовали за мой фактический рабочий ответ? –

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 

Данные, введенные образуют любое количество нк 9001 (или Netcat 9001) появится на н.д. -l 9000.

 Смежные вопросы

  • Нет связанных вопросов^_^