「client-to-serverA」接続は、トランスポートに関連付けられたプロトコルインスタンスによって表されます。これらは両方とも通常の古いPythonオブジェクトであるため、関数やクラス初期化子に引数として渡す、または他のオブジェクトの属性として設定するなどのことができます。
たとえば、クライアントから受信したバイトに応答して呼び出さClientToServerAProtocol
れるfetchServerBData
メソッドがある場合、次のように記述できます。
class ClientToServerAProtocol(Protocol):
...
def fetchServerBData(self, anArg):
factory = protocol.ClientFactory()
factory.protocol = Authenticate
factory.clientToServerAProtocol = self
reactor.connectSSL("localhost",31337, factory, ssl.ClientContextFactory())
作成するプロトコルの属性ClientFactory
として自分自身を設定するため、これから生じるインスタンスは `self.factory.clientToServerAProtocolと言い、その「client-to-serverA」接続への参照を取得できます。factory
Authenticate
このアプローチには多くのバリエーションがあります。最近導入されたエンドポイントAPIを使用した別のAPIを次に示します。
from twisted.internet.endpoints import SSL4ClientEndpoint
class ClientToServerAProtocol(Protocol):
...
def fetchServerBData(self, anArg):
e = SSL4ClientEndpoint(reactor, "localhost", 31337, ssl.ClientContextFactory())
factory = protocol.Factory()
factory.protocol = Authenticate
connectDeferred = e.connect(factory)
def connected(authProto):
authProto.doSomethingWith(self)
connectDeferred.addCallback(connected)
ここでも同じ基本的な考え方-プロトコルself
への関心のある「client-to-serverA」接続への参照を与えるために使用します。Authenticate
ここでは、ネストされた関数を使用して「クローズオーバー」しself
ました。これは、プログラムの適切な部分への参照を取得するための多くのオプションの1つにすぎません。