質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Q&A

0回答

957閲覧

websocketでclientからserverへ連続的にデータを送信する方法

panpukin63

総合スコア10

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

0グッド

0クリップ

投稿2018/10/21 08:35

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問