2016-07-25 3 views
0

まず、私はasyncioまたはその 'パラダイム'を完全に新しくしています。asyncioでtelnetクライアントを作成する方法

私は、asyncio.open_connection()でasyncio(python 3.4)クライアントを実装しようとしています。これは、tcpソケット(telnet)でリクエストを送信し、その応答を読み込んで、同時に何かを送るかもしれません。

つまり、私は初期化している双方向通信が必要なので、私はクライアントです。しかし、今まで私が見つけたすべての例は、StreamReaderStreamWriterを使って、空の行を読んだ後で強制的に改行されました。また、受信メッセージ(すべてのメッセージがちょうど1行である場合)は、前のリクエストまたは他の側の元のメッセージへの応答です。 私はこれがうまくいくかもしれないと思っていました。

class MyHandler: 
    @asyncio.coroutine 
    def connect(self): 
     self.reader, self.writer = asyncio.open_connection('localhost', 2020) 

     while True: 
      msg = self.reader.readline() 
      if msg is None: 
       asyncio.sleep(1) 
       continue 
      self.handle_msg(msg) 

    @asyncio.coroutine 
    def request(self, msg): 
     self.writer.write(msg) 
     return self.reader.readline() 

if __name__ == '__main__': 
    h = MyHandler() 
    loop = asyncio.get_event_loop() 
    loop.run_until_complete(h.connect) 
    loop.close() 

私はこの質問を作成する際にのみこのコードを書いています。今、私はそれを実行し始める、それは主なポイントに到達する前にも失敗します。何とかloop.run_until_complete(h.connect)TypeError: A Future or coroutine is requiredで失敗します。

+0

なぜ、以前のリクエストに対する応答の一部ではないデータがサーバーから送信されるのですか? – Vincent

+0

プロトコルがうまく設計されておらず、2点通信だけを意味するため。 – gjask

+0

最大の問題は、asyncioライブラリ、私のlibのバージョンに二次非互換のドキュメントの私の間違った理解だった。私がしなかったことは、asyncio.ensure_futureまたはasyncio.async(libのバージョンに応じて)で保留中のものを設定してから、イベントループを実行することです。 – gjask

答えて

0

は関数ですが、h.connect()はコルーチンです。これは、正しいコードが次のようになることを意味します。

class MyHandler: 
    @asyncio.coroutine 
    def connect(self): 
     self.reader, self.writer = asyncio.open_connection('localhost', 2020) 

     while True: 
      msg = yield from self.reader.readline() # Yield from since it's a coroutine 
      if msg.strip() is None: 
       yield from asyncio.sleep(1) # Also a coroutine 
       continue 
      self.handle_msg(msg) 

    @asyncio.coroutine 
    def request(self, msg): 
     self.writer.write(msg) 
     return (yield from self.reader.readline()) 

if __name__ == '__main__': 
    h = MyHandler() 
    loop = asyncio.get_event_loop() 
    loop.run_until_complete(h.connect()) 
    loop.close() 
関連する問題