「対話型」のクライアント/サーバーの動作という適切な言葉がないため、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()
これは非常に簡単なことだと思いますが、膨大な数の例とドキュメントに数え切れないほどの時間を費やしたため、このシナリオをどのように扱うべきかをよく理解できませんでした。