0

次の基本構造でAPIを実装しています。

  1. serverAを実行します
  2. クライアントはserverAに接続し、データを送信します
  3. ServerAはデータを処理し、serverBに送信します
  4. ServerBはserverAに応答します
  5. ServerAは、serverBから受信した入力に基づいてクライアントの要求に応答します

これまでに2つの解決策を試しました。

1)httplibを使用して標準の非ツイストTCP接続を作成し、serverAからserverBへの要求を処理します。ただし、これにより、httplib呼び出しの間、サーバーが効果的にブロックされます。

2)protocol.Protocolから継承する2番目のクラスを作成して使用します

factory = protocol.ClientFactory()
factory.protocol = Authenticate
reactor.connectSSL("localhost",31337,factory, ssl.ClientContextFactory())

serverAとserverBの間の接続を作成します。ただし、これを行うと、リクエストクラスのコールバック内から元のclient-to-serverA接続にアクセスできないようです。

Twistedでそのような設定を処理する正しい方法は何でしょうか?

4

1 に答える 1

2

「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」接続への参照を取得できます。factoryAuthenticate

このアプローチには多くのバリエーションがあります。最近導入されたエンドポイント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つにすぎません。

于 2012-11-30T13:10:05.387 に答える