ツイストでは、どのように「connectionMade」火の特定は延期することができますか?
-
05-09-2019 - |
質問
これは、より大きなプログラムの一部です。私は、関連する部分だけを説明します。基本的に、私のコードは、リモートホストへの新しい接続を作成したいと考えています。これは、接続が確立されるとトリガーする、繰延返す必要がありますので、私はそれで何かを送ることができます。
私はtwisted.internet.interfaces.IReactorSSL.connectSSL
との接続を作成しています。それは、新しい接続(buildProtocol
)オブジェクトを取得するために私のClientFactory
インスタンス上twisted.internet.protocol.Protocol
を呼び出し、twisted.internet.interfaces.IConnector
を返します。接続が開始されると、ツイストはそれをstartedConnecting
を与え、工場にIConnector
を呼び出します。接続が実際に行われた場合、プロトコルのconnectionMade
コールバックは引数なしで呼び出されます。
さて、残りは簡単だろう。 connectSSL
を呼び出す前に、私は繰延作成しますと(ホスト、ポート)をキーと辞書にそれを置きます。次に、プロトコルのconnectionMadeに、私は、ホスト/ポートを取得するためにself.transport.getPeer()
を使用繰延をルックアップするためにそれを使用し、そのコールバックを発射することができます。しかし、これは明らかに、私は複数の接続を作成したい場合にブレークダウンします。
問題は、私は私が後でconnectSSL
とconnectionMade
を呼び出す前に作成した繰延ます。
解決
いくつかのより多くの本を見て、私は、私は解決策を考え出すたと思います。これは一種の奇妙なようです。
ツイストは、単純な使い捨ての接続を生成するために使用されるクラス、ClientCreator
を有しています。理論的にはそれは私が何をしたいん。接続し、接続が確立される火災Deferred
を返します。私は、プロトコルのコンストラクタに引数を渡す機能を失い、そのための接続間で状態を共有する方法がありませんと思いますので、私は、しかし、私はこれを使用することができるとは思わなかった。
しかし、私はちょうどClientFactory
コンストラクタは、プロトコルのコンストラクタに渡す*args
を受け入れないことに気づきました。あるいは、少なくとも、それはそれのように見えます。このため実質的にはドキュメントがあります。その場合、私はそれを私の工場(または任意の他、工場はもはや必要であれば)への参照を与えることができます。そして私は、接続が確立される火災Deferred
を取り戻すます。