Я пытаюсь написать программу, которая будет прослушивать данные (простые текстовые сообщения) на каком-либо порту (скажем, tcp 6666), а затем передать их одному или нескольким другим протоколам - irc, xmpp и т.д. Я пробовал много подходов и копал Интернет, но я не могу найти легкое и рабочее решение для выполнения этой задачи.
Код, с которым я сейчас сражаюсь, находится здесь: http://pastebin.com/ri7caXih
Я хотел бы знать, как с объекта вроде:
ircf = ircFactory ('asdfasdf', '# asdf666')
получить доступ к методам собственного протокола, потому что это:
self.protocol.dupa1 (MSG)
возвращает ошибку о том, что я не передается активному объекту протокола. Или, может быть, есть другой, лучший, более простой и более кошерный способ создания единого реактора с несколькими протоколами и срабатывает действие, когда сообщение приходит к любому из них, а затем передает это сообщение другим протоколам для обработки/обработки/отправки?
Любая помощь будет высоко оценена!
Вот пример кода для чтения из нескольких подключений к порту 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.
Об этом говорится в FAQ.
См. doc/core/examples/chatserver.py
. Там они добавили привязки к методам Protocol
connectionMade
и connectionLost
для поддержки списка подключенных клиентов, а затем он выполняет итерацию через все из них, когда приходит сообщение.
Service
вами Service
, которая содержит ссылку на ваши фабрики irc
и nagios
и передает им сообщения.