我在这个网站上略微修改了服务器客户端Twisted程序,该程序提供了一个可以充当服务器和客户端的程序(http://stackoverflow.com/questions/3275004/how-to-write-a-双绞线服务器即此结果也-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()
我应该提一下,我能够分别通过端口4321和1234与外部服务器和外部客户端连接到服务器 - 客户端程序,它们只是回显。此外,我没有展示我使用self.factory引用的许多尝试。任何建议或建议将不胜感激。
答案 0 :(得分:5)
这个问题非常类似于Twisted FAQ中的流行问题:
How do I make input on one connection result in output on another?
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()
请注意:
__init__
上的ClientProtocol
方法。 ClientFactory
在没有参数的情况下调用其协议。需要参数的__init__
将导致TypeError
被引发。此外,ClientFactory
已将自身设置为其创建的协议的工厂属性。ClientProtocol
实例设置为ServerProtocol
属性,为ServerProtocol
实例提供了originator
引用。由于ClientProtocol
实例具有对ClientFactory
实例的引用,这意味着它具有对ServerProtocol
实例的引用。forwardLine
方法,ClientProtocol
方法可以用ServerProtocol
指导ClientProtocol
执行ClientProtocol
连接建立后的应用逻辑。请注意,由于前一点,{{1}}调用此方法没有问题。