Pythonでは、WebSocketで通信することができます。
本記事では、PythonにおけるWebSocketの使い方を紹介します。
PythonのWebSocketの使い方を紹介します
本記事でわかること
- PythonのWebSocketの使い方
目次
WebSocketとは
WebSocketとは、対話方式に最適の通信方法です。
通信の特徴として、常時接続できることと、双方向で通信することができます。
PythonによるWebSocket
PythonによるWebSocketの使い方を紹介します。
WebSocketのライブラリをインストール
WebSocketのライブラリをインストールします。
コマンドライン
pip install fastapi uvicorn websocketsWebSocket通信(サーバー側)
サーバー側のWebSocket通信の使い方を紹介します。
ソースコード
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
app = FastAPI()
clients = set()
async def broadcast(sender, msg):
dead = []
for ws in clients:
if ws == sender:
continue
try:
await ws.send_text(msg)
except:
dead.append(ws)
for d in dead:
clients.remove(d)
@app.websocket("/ws")
async def websocket_endpoint(ws: WebSocket):
await ws.accept()
clients.add(ws)
print("client connected")
try:
while True:
msg = await ws.receive_text()
await broadcast(ws, msg)
except WebSocketDisconnect:
clients.remove(ws)
print("client disconnected")コマンド実行例
$ uvicorn python-websocket-server:app --reload
INFO: Will watch for changes in these directories: ['/home/user/']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [1164753] using StatReload
INFO: Started server process [1164755]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: 127.0.0.1:55778 - "WebSocket /ws" [accepted]
client connected
INFO: connection open
INFO: 127.0.0.1:33024 - "WebSocket /ws" [accepted]
client connected
INFO: connection open
client disconnected
INFO: connection closed
client disconnected
INFO: connection closed
INFO: Shutting down
INFO: Waiting for application shutdown.
INFO: Application shutdown complete.
INFO: Finished server process [1164755]
INFO: Stopping reloader process [1164753]WebSocket通信(クライアント側)
クライアント側のWebSocket通信の使い方を紹介します。
ソースコード
import asyncio
import websockets
import sys
URI = "ws://localhost:8000/ws"
async def sender(ws):
loop = asyncio.get_event_loop()
while True:
line = await asyncio.to_thread(sys.stdin.readline)
if not line:
break
await ws.send(line.rstrip())
async def receiver(ws):
try:
async for msg in ws:
print(msg)
except:
pass
async def main():
async with websockets.connect(URI) as ws:
await asyncio.gather(sender(ws), receiver(ws))
try:
asyncio.run(main())
except KeyboardInterrupt:
passコマンド実行例
$ python3 -B python-websocket-client.py
HelloPythonによるWebSocket実行例
PythonによるWebSocketの実行例を紹介します。
上記のソースコードを利用して、WebSocket通信を実行します。
WebSocketサーバーを実行
WebSocketサーバーを実行します。
実行例
$ uvicorn python-websocket-server:app --reloadWebSocketクライアント1を実行
WebSocketクライアント1を実行します。
実行例
$ python3 -B python-websocket-client.py WebSocketクライアント2を実行
WebSocketクライアント2を実行します。
実行例
$ python3 -B python-websocket-client.py WebSocketクライアント1で文字列を入力して送信
WebSocketクライアント1で文字列を入力して送信します。
実行例
HelloWebSocketクライアント2で文字列を受信
WebSocketクライアント2で文字列を受信します。
実行例
Helloまとめ
PythonのWebSocketの使い方を紹介しました。
PythonのWebSocketは
- 双方向で通信できる
- サーバー経由で通信できる
PythonによるWebSocketでは、サーバー経由で通信でき、双方向で通信することができます。
双方向での通信が必要なアプリケーションを作成する際に最適な通信方式です。
チャットアプリに最適な通信方式のため、チャットアプリを自作したい場合に採用すると良いです。

