我一直在努力理解如何让Twisted执行“交互式”客户端/服务器行为。
我成功地编写了一对Protocol和ClientFactory类,可以连接到服务,并执行立即的查询/响应(请参见:connectionMade -> self.queryStatus)。这符合预期,从Factory类打印服务器的响应。
现在我的问题是,我有些外部事件必须导致数据被发送出去,同时始终监听潜在的传入数据。但是一旦reactor.run()循环开始运行,我不知道我的应用程序的其余部分如何触发数据发送。
我尝试了几种不同的方法,但这是最简单的方法,它按照上述方式处理了接收部分:
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()
我认为这很简单,但是数小时的不断尝试和查阅文档并没有让我很好地理解我应该如何处理这种情况。