前提・実現したいこと
clientが取得したデータをserverへ送信し続けてserverがそのデータをすぐに処理できるようにしたい。
具体的には、
(1) client側にデータを流し込み、それをloop的に処理して、serverへ送信
(2) server側ではloopでlistenしてデータを連続的に受信し、その他の処理に回す。
を考えています。
その際、pythonのwebsocketのライブラリとして様々にありますが、それよりもasyncioの仕組みを理解できていない気がします。基本理解としての試行錯誤の過程で進まないので質問しました。
発生している問題・エラーメッセージ
client側ではserverへのメッセージ送信をする際に連続送信をループを回してます。
その二回目で以下のエラーがでます。server側のエラーはありません。
File "/usr/lib/python3/dist-packages/websocket/_socket.py", line 89, in recv raise WebSocketConnectionClosedException("Connection is already closed.") websocket._exceptions.WebSocketConnectionClosedException: Connection is already closed.
自分としては、常にserverがlistenしている(つまりkeep aliveも必要?)状態で、
clientが好きなときにwebsocketを通じてデータを間欠的にも連続的にもとにかく送信できればよいです。
該当のソースコード
client側がserverへメッセージをsleepなしで連続送信するプログラム
#!/usr/bin/env python3 import websocket ws_server_ip = "serverのip" ws_server_port = "serverのport" ws = websocket.create_connection('ws://'+str(ws_server_ip)+":"+str(ws_server_port)) for idx in range(1,10): ws.send(str(idx)+"-th msg") #time.sleep(1) result = ws.recv() print("Received '%s'" % result) #time.sleep(1) ws.close()
server側がclientからのメッセージを受信して表示するプログラム
#!/usr/bin/env python3 ws_server_ip = "serverのip" ws_server_port = "serverのport" import asyncio import websockets async def hello(websocket, path): name = await websocket.recv() print("client:"+str(name)) greeting = "reply to"+str(name) #await websocket.send(greeting) #print("server"+str(greeting)) start_server = websockets.serve(hello, host=bind_ip,port=bind_port) loop = asyncio.get_event_loop() loop.run_until_complete(start_server) loop.run_forever()
試したこと
補足情報(FW/ツールのバージョンなど)
python 3.6
ubuntu 18.04
websockets 6.0
あなたの回答
tips
プレビュー