2017-02-17 3 views
0

サブクラスasyncio.Protocolを使用して、一部のサーバーに接続するTCPクライアントを作成しました。 は、下位レベルのインターフェイスをアプリケーションから分離し、階層化されたアーキテクチャを作成したいと思いますが、どのように進めるかは分かりません。 asyncio.Protocolに基づいたクラスでインターフェイスメソッド(sendやrecvなど)を公開して使用する方法

私は TCP Echo Client present on the official documentationの例に続き、私はクライアントを起動する方法も非常に似ている:私はにサービスを提供する(技術的にサービスアクセスポイント)の2つのメソッドを作成し、私のプロトコルで、

loop = asyncio.get_event_loop() 
coro = loop.create_connection(partial(MyClient, loop), 
           '127.0.0.1', 8888) 
loop.run_until_complete(coro) 
loop.run_forever() 
loop.close() 

しかし、 「N + 1」層:setDataReceivedCallbackは、コールバックを登録するために使用されるであろうしながらsend方法は、サーバ(リクエスト)メッセージを送信するために、N + 1層で使用される

def setDataReceivedCallback(self, fun): 
    self.dataReceivedIndication = fun 

def send(self, msg): 
    self.transport.write(msg) 

012と呼ばれるが呼び出される(その結果、プロトコルは、データが到着したというN + 1層への指示を発行することができる)。

しかし、どのようにしてこれらのエントリポイントを取得できるかわかりません。

  • create_connectionは、プロトコルのインスタンスを返す呼び出し可能が必要です:より明確にする ので、私はその時にインスタンスのホールドを取得することができなくなりますが
  • loopポイントコルーチンのいずれかが露出しないようですさらに、一度run_foreverを実行すると、ループ自体を保持する能力がなくなります

私はここで何が欠けていますか?

答えて

0

Loです。答えはドキュメントにあります。 Creating Connections上のセクションから:

注protocol_factoryが呼び出し可能、必ずしも クラスのいずれかの種類のことができます。たとえば、あらかじめ作成されたプロトコル インスタンスを使用する場合は、lambda:my_protocolを渡すことができます。

コードに変換これは、以下の手段:

loop = asyncio.get_event_loop() 
ThisClient = MyClient(loop) 
ThisClient.setDataReceivedCallback(whateverFunction) 
# And you can also use and pass around ThisClient.send at this point 

coro = loop.create_connection(lambda: ThisClient, 
           '127.0.0.1', 8888) 
loop.run_until_complete(coro) 
loop.run_forever() 
loop.close() 
関連する問題