簡単なクライアント/サーバーのセットアップがあります。クライアントコードは次のとおりです。
from twisted.internet import reactor
from twisted.internet import protocol
from twisted.internet.endpoints import TCP4ClientEndpoint
class MyProtocol(protocol.Protocol):
def connectionMade(self):
print "Hello!"
def dataReceived(self, data):
print data
class MyProtocolFactory(protocol.ClientFactory):
def startedConnecting(self, connector):
print "Starting to connect!"
def buildProtocol(self, addr):
return MyProtocol()
def clientConnectionLost(self, connector, reason):
print "Lost connection, reason = %s" % reason
def clientConnectionFailed(self, connector, reason):
print "Connection failed, reason = %s" % reason
reactor.stop()
endpoint = TCP4ClientEndpoint(reactor, "127.0.0.1", 54321, timeout=5)
endpoint.connect(MyProtocolFactory())
reactor.run()
何らかの理由で、このクライアントはサーバーに接続し、プロトコルは正しく機能します(接続が成功すると、サーバーから送信されたデータとともに「Hello!」が出力されます)が、プロトコルファクトリは呼び出されません。メソッド。StartedConnectingが呼び出されず、サーバーを停止してもclientConnectionLostが呼び出されません。サーバーが起動する前にクライアントを実行しようとすると、clientConnectionFailedが呼び出されることも期待できます。
これが奇妙な部分です...上記のコードの最後の3行を次のように変更した場合:
reactor.connectTCP("127.0.0.1", 54321, MyProtocolFactory())
reactor.run()
その後、すべてが期待どおりに機能し、上記のすべてのケースですべてのメソッドが呼び出されます。
エンドポイントについての私の理解は、それらが(とりわけ)「connectTCP」を追加の動作でラップすることですが、それが2番目のコードスニペットで機能する理由を理解できませんが、最初のコードスニペットでは機能しません。
何か案は?
クライアントエンドポイントインターフェイスは、の追加の接続状態通知メソッドを呼び出しませんClientFactory
。
したがって、エンドポイントはある意味で「ラップ」などを行いますが、connectTCP
それらがこれらの低レベルのメソッドを使用するのとまったく同じ動作をするというのは真実ではありません。
エンドポイントの場合、ファクトリの仕事はプロトコルインスタンスを提供することです。工場は、接続管理の他の側面についてはもはや責任を負いません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加