扭曲的服务器 - 客户端数据共享

Boh*_*ian 4 twisted

我稍微修改了这个站点上的服务器客户端Twisted程序,该程序提供了一个可以充当服务器和客户端的程序(http://stackoverflow.com/questions/3275004/how-to-write-a-twisted-server -即此结果也-A-客户端).我能够将服务器客户端连接到一侧的外部客户端和另一端的外部服务器.我想通过服务器 - 客户端程序将数据从外部客户端传输到外部服务器.我遇到的问题是将ServerProtocol类(在服务器 - 客户端程序中)收到的行放入ClientProtocol类(在服务器 - 客户端程序中).我已经尝试了很多方法,包括尝试使用工厂引用,正如你可以从def init看到的那样但是我无法让它工作.(目前我只是向外部服务器和客户端发送文字)这是服务器 - 客户端代码:

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


class ServerProtocol(basic.LineReceiver):        
    def lineReceived(self, line):
        print "line recveived on server-client",line
        self.sendLine("Back at you from server-client")
        factory = protocol.ClientFactory()
        factory.protocol = ClientProtocol
        reactor.connectTCP('localhost', 1234, factory)

class ClientProtocol(basic.LineReceiver):
    def __init__(self, factory):
        self.factory = factory

    def connectionMade(self):
        self.sendLine("Hello from server-client!")
        #self.transport.loseConnection()

    def lineReceived(self, line):
        print "line recveived on server-client1.py",line
        #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()
Run Code Online (Sandbox Code Playgroud)

我应该提一下,我能够分别通过端口4321和1234与外部服务器和外部客户端连接到服务器 - 客户端程序,它们只是回显.此外,我没有展示我使用self.factory引用的许多尝试.任何建议或建议将不胜感激.

Jea*_*one 5

这个问题非常类似于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()
Run Code Online (Sandbox Code Playgroud)

请注意:

  • 我摆脱了__init__方法ClientProtocol. ClientFactory不带参数调用其协议.一个__init__是需要一个参数将导致TypeError被提出.此外,ClientFactory已将自身设置为其创建的协议的工厂属性.
  • 我通过将实例设置为客户端工厂上的属性ClientProtocol来提供对ServerProtocol实例的引用.由于实例具有对实例的引用,这意味着它具有对实例的引用.ServerProtocoloriginatorClientProtocolClientFactoryServerProtocol
  • 我添加了forwardLine哪种方法ClientProtocol可以使用直接ServerProtocol做任何应用程序逻辑是,一旦ClientProtocol连接建立.请注意,由于前一点,ClientProtocol调用此方法没有问题.