Twisted服务器客户端数据共享

2024-09-29 17:19:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我稍微修改了这个站点上的一个服务器-客户端Twisted程序,它提供了一个可以充当服务器和客户端的程序(http://stackoverflow.com/questions/3275004/how-to-write-a-twisted-server-that-is-also-a-client). 我能够将服务器客户端连接到一个外部客户端和另一个外部服务器。我想通过服务器客户端程序将数据从外部客户端传输到外部服务器。我遇到的问题是将ServerProtocol类(在服务器客户机程序中)中接收到的行放入ClientProtocol类(在服务器客户机程序中)。我已经尝试了很多方法来实现这一点,包括尝试使用factory reference,正如您从definit中看到的那样,但我无法使其工作。(目前我只是向外部服务器和客户端发送文本)下面是服务器客户端代码:

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()

我应该提到,我能够连接到服务器客户端程序与外部服务器和外部客户端分别在端口4321和1234,他们只是回显。而且,我还没有展示我多次尝试使用自工厂参考。任何建议或建议将不胜感激。在


Tags: fromimportself程序服务器client客户端server
1条回答
网友
1楼 · 发布于 2024-09-29 17:19:57

这个问题与Twisted常见问题解答中的一个非常相似:

How do I make input on one connection result in output on another?

与您所说的一个传入客户端连接和一个传出客户端连接的问题相比,常见问题解答项讨论的是多个到一个服务器的客户端连接,这没有任何显著区别。不同连接之间共享数据的方式是相同的。在

这个常见问题解答的要点是,基本上,您要做的任何事情都涉及某种方法调用,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()

注意如何:

  • 我去掉了__init__上的__init__方法。ClientFactory不带参数调用其协议。需要参数的__init__将引发TypeError。另外,ClientFactory已经将自己设置为它创建的协议的factory属性。在
  • 我通过在客户机工厂上将ServerProtocol实例设置为originator属性,给了ClientProtocolServerProtocol实例的引用。由于ClientProtocol实例引用了ClientFactory实例,这意味着它引用了ServerProtocol实例。在
  • 我添加了forwardLine方法,一旦ClientProtocol建立了连接,ClientProtocol可以使用该方法来指导{}执行任何应用程序逻辑。注意,由于前一点,ClientProtocol调用此方法没有问题。在

相关问题 更多 >

    热门问题