Twisted - 如何创建多协议进程并在协议间发送数据

1 投票
3 回答
4199 浏览
提问于 2025-04-15 20:54

我正在尝试写一个程序,这个程序会监听某个端口(比如说 tcp 6666)上的数据(简单的文本消息),然后把这些消息传递给一个或多个不同的协议,比如 irc、xmpp 等等。我尝试了很多方法,也在网上查了很多资料,但就是找不到简单有效的解决方案。

我现在正在挣扎的代码在这里:http://pastebin.com/ri7caXih

我想知道如何从像这样的对象中:

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

访问它的协议方法,因为这样:

self.protocol.dupa1(msg)

会返回一个错误,提示没有将 self 传递给活动的协议对象。或者,也许有其他更好、更简单、更合适的方法来创建一个单一的反应器,支持多个协议,并在任何协议收到消息时触发相应的操作,然后把这个消息传递给其他协议进行处理或发送?

任何帮助都将非常感谢!

3 个回答

1

可以查看这个链接:doc/core/examples/chatserver.py。在这里,他们在ProtocolconnectionMadeconnectionLost这两个方法中添加了钩子,用来维护一个连接客户端的列表。当有消息到达时,他们会遍历这个列表,把消息传递给所有连接的客户端。

5

这里有一段示例代码,用来从多个连接的9001端口读取数据,并把这些数据写到9000端口的一个连接上。你需要为不同的协议,比如XMPP、IRC、MSN等,分别实现多个“PutLine”功能。

我使用了一个全局变量来存储输出连接的PutLine,但你可能想要创建一个更复杂的工厂对象来处理这个问题。

#!/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上。

撰写回答