将在一个Twisted工厂收到的数据发送到第二工厂

Spa*_*kMe 5 python irc factory xmpp twisted

我正在尝试使用Twisted框架编写一个简单的程序,我正在努力解决(甚至成像如何编写它)问题我找不到任何相关的文档:

主反应堆使用两个工厂,一个自定义,在给定端口(例如,8000)上侦听TCP连接,第二个,以登录到给定的IRC服务器和通道.在工厂收听8000时接收数据(简单,一行文本)时,我需要将该数据传递给第二工厂,然后可以相应地处理它 - 将带有该文本的消息发送到通道,或者发送一条私有消息对某些人而言,现在并不重要.我找不到任何方法从第一个工厂获取数据并将其发送到另一个工厂进行处理(可能像第二个IRC工厂通常收到的连接?).

如果这可以以某种方式解决,那么我想添加一个甚至更多的工厂(例如Jabber)将端口8000上的接收数据一次性发送到所有这些工厂,将其相应地传递给协议(IRC到一个频道, Jabber给一个联系人,等等).

是否有人遇到类似的问题,并愿意给我一些建议,甚至分享一些代码行?任何帮助将非常感谢!

提前致谢.

nos*_*klo 6

工厂只是对象.要将数据从一个传递到另一个,您可以定义和调用方法并将数据作为参数或设置属性传递.我认为这个常见问题可以帮助你:

如何在一个连接上输入导致另一个连接的输出?

这似乎是一个扭曲的问题,但实际上这是一个Python问题.每个Protocol对象代表一个连接; 你可以调用它transport.write来写一些数据.这些是常规的Python对象; 您可以将它们放入列表,词典或任何其他适合您的应用程序的数据结构中.

举一个简单的例子,添加一个列表给工厂,并在协议的 connectionMadeconnectionLost,把它添加到并从列表中删除.这是Python代码:

from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor

class MultiEcho(Protocol):
    def connectionMade(self):
        self.factory.echoers.append(self)
    def dataReceived(self, data):
        for echoer in self.factory.echoers:
            echoer.transport.write(data)
    def connectionLost(self, reason):
        self.factory.echoers.remove(self)

class MultiEchoFactory(Factory):
    protocol = MultiEcho
    def __init__(self):
        self.echoers = []

reactor.listenTCP(4321, MultiEchoFactory())
reactor.run()
Run Code Online (Sandbox Code Playgroud)