「WebSocket通信で処理速度を高めたい」
「サーバーからクライアントへプッシュ型の情報配信を行いたい」
「PythonでWebSocket通信のクライアントを実装したい」
このような場合には、websocket-clientがオススメです。
この記事では、PythonでWebSocket通信用クライアントを実装する方法を解説しています。
本記事の内容
- websocket-clientとは?
- websocket-clientのシステム要件
- websocket-clientのインストール
- websocket-clientの動作確認
それでは、上記に沿って解説していきます。
websocket-clientとは?
websocket-clientは、Python用のWebSocketクライアントです。
クライアントに特化しているのが、特徴になりますね。
そして、websocket-clientはWebSocketプロトコルのバージョンhybi-13を実装しています。
hybi-13ということで、現状では適切な対応状況と言えます。
以上、websocket-clientについて説明しました。
次は、websocket-clientのシステム要件を説明します。
websocket-clientのシステム要件
現時点(2022年4月)でのwebsocket-clientの最新バージョンは、1.3.2となります。
この最新バージョンは、2022年3月29日にリリースされています。
サポートOSに関しては、以下を含むクロスプラットフォーム対応です。
- Windows
- macOS
- Linux
サポート対象となるPythonのバージョンは、以下となっています。
- Python 3.7
- Python 3.8
- Python 3.9
- Python 3.10
このサポート状況は、以下のPython公式開発サイクルに従っていますね。
バージョン | リリース日 | サポート期限 |
3.6 | 2016年12月23日 | 2021年12月23日 |
3.7 | 2018年6月27日 | 2023年6月27日 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年10月5日 | 2025年10月 |
3.10 | 2021年10月4日 | 2026年10月 |
公式開発サイクルに従うのは、簡単なようで難しいことです。
実際、公式開発サイクルに従っているライブラリはそれほど多くありません。
ほとんどが無視するか、適切にsetup.pyを記載していません。
だから、それだけでwebsocket-clientの信用度はUPします。
まとめると、websocket-clientのシステム要件はPython 3.7以降だけですね。
Python 3.7以降にだけ注意すれば、特に問題はないでしょう。
以上、websocket-clientのシステム要件を説明しました。
次は、websocket-clientのインストールを説明します。
websocket-clientのインストール
検証は、次のバージョンのPythonで行います。
$ python -V Python 3.10.2
まずは、現状のインストール済みパッケージを確認しておきます。
$ pip list Package Version ---------- ------- pip 22.0.4 setuptools 62.1.0 wheel 0.36.2
次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip setuptools
では、websocket-clientのインストールです。
websocket-clientのインストールは、以下のコマンドとなります。
pip install websocket-client
websocket-clientのインストールは、すぐに終わります。
終了したら、どんなパッケージがインストールされたのかを確認します。
$ pip list Package Version ---------------- ------- pip 22.0.4 setuptools 62.1.0 websocket-client 1.3.2 wheel 0.36.2
websocket-clientには、依存するパッケージが存在していません。
そのため、既存環境にも容易に導入できますね。
以上、websocket-clientのインストールを説明しました。
次は、websocket-clientの動作確認を行います。
websocket-clientの動作確認
以下の2つの動作を確認しておきます。
- 短命の接続(一時的)
- 長命の接続(永続的)
短命の接続(一時的)
短命の接続を行うコードは、以下。
import websocket ws = websocket.WebSocket() ws.connect("ws://echo.websocket.events") ws.send("Hello, Server") print(ws.recv()) ws.close()
上記をコードを実行した結果は、以下。
echo.websocket.events sponsored by Lob.com
これが表示されると、動作は成功しています。
ただ、これだけだとイマイチ動作を掴めません。
そこでデバッグモードにしてログを表示してみます。
以下のコードを追加します。
websocket.enableTrace(True)
場所は、「ws = websocket.WebSocket()」の前です。
コードを追加して、実行した結果は以下。
--- request header --- GET / HTTP/1.1 Upgrade: websocket Host: echo.websocket.events Origin: http://echo.websocket.events Sec-WebSocket-Key: WHG/vN20l3+7numTNq/smA== Sec-WebSocket-Version: 13 Connection: Upgrade ----------------------- --- response header --- HTTP/1.1 101 Switching Protocols Connection: Upgrade Upgrade: websocket Sec-Websocket-Accept: 4LEohCwjhgiPrbbec4gqieQ++EY= Via: 1.1 vegur ----------------------- ++Sent raw: b'\x81\x8dJ\x8e\n{\x02\xebf\x17%\xa2*(/\xfc|\x1e8' ++Sent decoded: fin=1 opcode=1 data=b'Hello, Server' ++Rcv raw: b'\x81*echo.websocket.events sponsored by Lob.com' ++Rcv decoded: fin=1 opcode=1 data=b'echo.websocket.events sponsored by Lob.com' ++Sent raw: b'\x88\x82\x8d\xba\xc2\x0c\x8eR' ++Sent decoded: fin=1 opcode=8 data=b'\x03\xe8' echo.websocket.events sponsored by Lob.com
先ほどよりは、これで外部サーバーと通信しているのがわかります。
長命の接続(永続的)
WebSocketでは、永続的にサーバーとクライアントで接続するのが一般的です。
サーバーからのプッシュ型の情報配信も永続的な接続に依存します。
その動作を確認できるのが、以下のコードになります。
import websocket def on_message(wsapp, message): print(message) wsapp = websocket.WebSocketApp("wss://testnet-explorer.binance.org/ws/block", on_message=on_message) wsapp.run_forever()
上記を実行すると、継続的に次のような情報が表示されます。
{"blockHeight":24595693,"blockHash":"4C911B38278218F2AD3B883F6C52101EAC0F6DF00B0663A52B5013770D9C9424","timeStamp":1649721471838,"txNum":0,"size":65536,"blockNode":"Everest","blockAge":3,"blockFeeList":[{"blockHeight":null,"address":null,"asset":"BNB","quantity":0E-8}],"feeCompleted":true}
接続が途切れない限り、表示され続けます。
この情報は、サーバーからプッシュ型で配信されている情報です。
以上、websocket-clientの動作確認を説明しました。