所以,我发现了许多使用Twisted创建多个并发客户端连接的示例,以及如何支持多个协议,以及如何遍历多个客户端(http://twistedmatrix.com/trac/wiki/FrequentlyAskedQuestions#HowdoImakeinputononeconnectionresultinoutputonanother),但我正在寻找什么是一个代码片段,演示了如何从侦听器套接字读取数据,进行一些操作,并通过客户端套接字写出来。
我知道我很接近,我还没有确定模式。
要清楚,我想从端口9000读取一行 - >传递给工厂 - >运行algo - >将端口9001写入不同的进程。
class ClientSideProtocol(basic.LineReceiver):
def __init__(self, factory):
self.factory = factory
def connectionMade(self):
print "Made Connection to JoaC"
def connectionLost(self, reason):
print "Lost Connection to JoaC"
def lineReceived(self, line):
self.sendline(self.factory.tb.runAlgo(line))
class EmulatorFactory(protocol.ClientFactory):
def __init__(self, sensorName):
self.tb = tbg2(sensorName)
def startedConnecting(self,connector):
print "Started to connect."
def buildProtocol(self, addr):
print "buildProtocol called"
return ClientSideProtocol(self)
def clientConnectionLost(self, connector, reason):
print 'Lost connection. Reason:', reason
def clientConnectionFailed(self, connector, reason):
print 'Connection failed. Reason:', reason
def main():
sensorName = "Test1"
mystuff = EmulatorFactory(sensorName)
reactor.listenTCP(9000, mystuff)
reactor.connectTCP(host = "localhost", port = 9001, factory = mystuff, timeout = 5)
reactor.run()
这大致是我到目前为止,我是在球场吗?
答案 0 :(得分:1)
您为客户端和服务器使用相同的工厂。这意味着当数据从客户端连接到服务器或从您连接的远程服务器到客户端连接时,您将很难做正确的事情。它们都将被传递到由同一工厂实例创建的相同类型的协议。您将如何决定如何处理数据?
我建议使用两个不同的工厂,而不是两个不同的协议。
接下来,这些行不会实现您想要的行为:
def lineReceived(self, line):
self.sendline(self.factory.tb.runAlgo(line))
接受从连接的远程端接收的数据,将其传递给runAlgo
,然后将runAlgo
的结果发送回连接的远程端。它不会将其传递给其他连接。您可以告诉它是相同的连接,因为self
已传递给lineReceived
,告诉您接收到哪个协议实例(以及哪个连接)。然后代码使用相同的self
发送一行 - 将其发送回同一个连接。如果要将其发送到其他连接,则需要在其他协议实例上调用sendLine
。