Twisted服务器客户端数据共享

Twisted服务器客户端数据共享,twisted,Twisted,我在这个站点上稍微修改了一个服务器-客户端Twisted程序,它提供了一个可以充当服务器和客户端的程序。我能够将服务器客户端连接到一侧的外部客户端和另一侧的外部服务器。我想通过服务器客户端程序将数据从外部客户端传输到外部服务器。我遇到的问题是将服务器客户端程序中ServerProtocol类中接收到的行放入服务器客户端程序中的ClientProtocol类。我已经尝试了很多方法,包括尝试使用工厂引用,正如您从definit中看到的,但是我无法让它工作。目前,我正在向外部服务器和客户端来回发送文本

我在这个站点上稍微修改了一个服务器-客户端Twisted程序,它提供了一个可以充当服务器和客户端的程序。我能够将服务器客户端连接到一侧的外部客户端和另一侧的外部服务器。我想通过服务器客户端程序将数据从外部客户端传输到外部服务器。我遇到的问题是将服务器客户端程序中ServerProtocol类中接收到的行放入服务器客户端程序中的ClientProtocol类。我已经尝试了很多方法,包括尝试使用工厂引用,正如您从definit中看到的,但是我无法让它工作。目前,我正在向外部服务器和客户端来回发送文本,以下是服务器客户端代码:

来自twisted.internet导入协议,reactor 从twisted.com导入基本协议 类ServerProtocolbasic.LineReceiver: def lineReceivedself,行: 在服务器客户端上接收到的打印行,行 从服务器客户端向您发送self.sendLineBack factory=protocol.ClientFactory factory.protocol=ClientProtocol reactor.connectTCP'localhost',1234,工厂 类ClientProtocolbasic.LineReceiver: def__初始__self,工厂: self.factory=工厂 def connectionMadeself: self.sendLineHello来自服务器客户端! 自动传输连接 def lineReceivedself,行: 在server-client1.py上接收到的打印行,行 自动传输连接 def主: 导入系统 从twisted.python导入日志 log.startoggingsys.stdout factory=protocol.ServerFactory factory.protocol=ServerProtocol reactor.listenTCP4321,工厂 反应堆运行 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 主要的
我应该提到,我能够通过端口4321和1234上的外部服务器和外部客户端分别连接到服务器客户端程序,它们只是回显。此外,我还没有多次尝试使用self.factory引用。任何建议都将不胜感激。

此问题与Twisted FAQ中的一个流行问题非常相似:

FAQ项目所讨论的是到一台服务器的多个客户端连接,与您提出的关于一个传入客户端连接和一个传出客户端连接的问题相比,这并没有什么显著区别。在不同连接之间共享数据的方式是相同的

从FAQ项目中我们可以看到,基本上您想要做的任何事情都涉及某种方法调用,Twisted中的方法调用与任何其他Python程序中的方法调用相同。您所需要的只是有一个对正确对象的引用来调用该方法。例如,调整代码:

from twisted.internet import protocol, reactor
from twisted.protocols import basic

class ServerProtocol(basic.LineReceiver):        
    def lineReceived(self, line):
        self._received = line
        factory = protocol.ClientFactory()
        factory.protocol = ClientProtocol
        factory.originator = self
        reactor.connectTCP('localhost', 1234, factory)

    def forwardLine(self, recipient):
        recipient.sendLine(self._received)

class ClientProtocol(basic.LineReceiver):
    def connectionMade(self):
        self.factory.originator.forwardLine(self)
        self.transport.loseConnection()

def main():
    import sys
    from twisted.python import log

    log.startLogging(sys.stdout)
    factory = protocol.ServerFactory()
    factory.protocol = ServerProtocol
    reactor.listenTCP(4321, factory)
    reactor.run()

if __name__ == '__main__':
    main()
注意:

我去掉了ClientProtocol上的_uinit__;方法。ClientFactory调用其协议时不带参数。需要参数的_uinit_uuu将导致引发TypeError。此外,ClientFactory已经将自己设置为它创建的协议的工厂属性。 我通过将ServerProtocol实例设置为客户端工厂上的originator属性,为ClientProtocol提供了对ServerProtocol实例的引用。由于ClientProtocol实例引用了ClientFactory实例,这意味着它引用了ServerProtocol实例。 我添加了forwardLine方法,ClientProtocol可以使用该方法在ClientProtocol连接建立后,指导ServerProtocol执行任何应用程序逻辑。请注意,由于前面的原因,ClientProtocol调用此方法没有问题。
谢谢你的推荐。我正在努力使它适应我的程序,而你刚才实际上发布了这个程序。但是,我应该提到,传出连接实际上是到服务器的。也许这没有什么区别,但我想我应该指出这一点。非常感谢。在我之前的回复之后,我试图将数据发送到另一台服务器而不是客户端,这似乎确实有所不同。我尝试在上面的ServerProtocol中创建一个factory.serverconnections[],然后在ClientProtocol中使用它,这样我就可以将数据从外部客户端连接传递到外部服务器连接,但是我得到了一个错误,即在后者中无法识别该列表。我会继续尝试,但如果你能看到我的方式中明显的错误,请指出。非常感谢你让我明白,并花时间解释如何在Twisted中使用这些方法。这是一个非常好和优雅的解决方案。谢谢