まず、私はasyncioまたはその 'パラダイム'を完全に新しくしています。asyncioでtelnetクライアントを作成する方法
私は、asyncio.open_connection()
でasyncio(python 3.4)クライアントを実装しようとしています。これは、tcpソケット(telnet)でリクエストを送信し、その応答を読み込んで、同時に何かを送るかもしれません。
つまり、私は初期化している双方向通信が必要なので、私はクライアントです。しかし、今まで私が見つけたすべての例は、StreamReader
とStreamWriter
を使って、空の行を読んだ後で強制的に改行されました。また、受信メッセージ(すべてのメッセージがちょうど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
で失敗します。
なぜ、以前のリクエストに対する応答の一部ではないデータがサーバーから送信されるのですか? – Vincent
プロトコルがうまく設計されておらず、2点通信だけを意味するため。 – gjask
最大の問題は、asyncioライブラリ、私のlibのバージョンに二次非互換のドキュメントの私の間違った理解だった。私がしなかったことは、asyncio.ensure_futureまたはasyncio.async(libのバージョンに応じて)で保留中のものを設定してから、イベントループを実行することです。 – gjask