2

これはより大きなプログラムの一部です。関連する部分だけを説明します。基本的に、私のコードはリモートホストへの新しい接続を作成したいと考えています。これにより、Deferredが返されます。これは、接続が確立されると起動するため、何かを送信できます。

との接続を作成していtwisted.internet.interfaces.IReactorSSL.connectSSLます。これはbuildProtocolClientFactoryインスタンスを呼び出して新しい接続(twisted.internet.protocol.Protocol)オブジェクトを取得し、を返しますtwisted.internet.interfaces.IConnector。接続が開始されると、Twistedはファクトリを呼び出しstartedConnecting、ファクトリにを与えますIConnector。接続が実際に確立されると、プロトコルのconnectionMadeコールバックが引数なしで呼び出されます。

これで、ホスト/ポートごとに1つの接続のみが必要な場合、残りは簡単になります。を呼び出す前connectSSLに、Deferredを作成し、キーが設定された辞書(host、port)に配置します。次に、プロトコルのconnectionMadeでself.transport.getPeer()、ホスト/ポートを取得し、それを使用してDeferredを検索し、そのコールバックを起動するために使用できます。しかし、複数の接続を作成したい場合、これは明らかに機能しなくなります。

connectSSL問題は、connectionMade後で呼び出す前に作成したDeferredを関連付ける他の方法が見当たらないことです。

4

1 に答える 1

0

これをもう少し見て、私は解決策を思いついたと思いますが、もっと良い方法があるといいのですが。これはちょっと変なようです。

Twistedには、ClientCreator単純な使い捨て接続を作成するために使用されるクラスがあります。理論的には、私が望むことを実行します。Deferred接続して、接続が確立されたときに起動するを返します。ただし、プロトコルコンストラクターに引数を渡すことができなくなり、接続間で状態を共有する方法がなくなるため、これを使用できるとは思いませんでした。

しかし、コンストラクターがプロトコルコンストラクターに渡すことをClientFactory受け入れることに気づきました。*argsまたは、少なくともそれはそれのように見えます。これに関するドキュメントは事実上ありません。その場合、自分のファクトリ(またはファクトリが不要になった場合は他の何か)への参照を与えることができます。Deferredそして、接続が確立されたときに発生するを取り戻します。

于 2009-02-20T17:39:22.943 に答える