由于没有更好的词,“交互式”客户端/服务器行为,我一直在努力思考如何让 Twisted 执行。
我设法将一对确实连接到服务的 Protocol 和 ClientFactory 类放在一起,并执行即时查询/响应(请参阅:connectionMade -> self.queryStatus)。这按预期成功并打印了来自 Factory 类的服务器响应。
我现在的问题是我将有必须导致数据发送的外部事件,同时始终监听潜在的传入数据。但是一旦 reactor.run() 循环开始,我不确定我的应用程序的其余部分是如何触发数据发送的。
从那以后,我尝试了几种不同的方法,但这是处理 recv 部分的最简单方法,如下所述:
class myListenerProtocol(LineReceiver):
delimiter = '\n'
def connectionMade(self):
print("Connected to: %s" % self.transport.getPeer())
self.queryStatus(1)
def dataReceived(self, data):
print("Receiving Data from %s" % self.transport.getPeer())
...
self.commandReceived(self.myData)
def commandReceived(self, myData):
self.factory.commandReceived(myData)
def connectionLost(self, reason):
print("Disconnected.")
def queryStatus(self, CommandValue):
...
strSend = CommandValue # or some such
self.transport.write(strSend)
class mySocketFactory(ClientFactory):
protocol = myListenerProtocol
def __init__(self):
pass
def buildProtocol(self, address):
proto = ClientFactory.buildProtocol(self, address)
return proto
def commandReceived(self, myData):
print myData
reactor.stop() # It won't normally stop after recv
def clientConnectionFailed(self, connector, reason):
print("Connection failed.")
reactor.stop()
def main():
f = mySocketFactory()
reactor.connectTCP("10.10.10.1", 1234, f)
reactor.run()
我想这很简单,但是无数小时的大量示例和文档让我无法很好地理解我打算如何处理这种情况。