MENU
やすひら
やすひらと申します。
長靴を履いたタヌキ(ITエンジニア)です。
モノ作りの楽しさを発信中。
X(旧Twitter)のフォローもお願いします。

[Python]WebSocketによる通信

Pythonでは、WebSocketで通信することができます。
本記事では、PythonにおけるWebSocketの使い方を紹介します。

やすひら

PythonのWebSocketの使い方を紹介します

本記事でわかること
  • PythonのWebSocketの使い方
目次

WebSocketとは

WebSocketとは、対話方式に最適の通信方法です。
通信の特徴として、常時接続できることと、双方向で通信することができます。

PythonによるWebSocket

PythonによるWebSocketの使い方を紹介します。

WebSocketのライブラリをインストール

WebSocketのライブラリをインストールします。

コマンドライン

pip install fastapi uvicorn websockets

WebSocketに必要なライブラリをインストールしました。

WebSocket通信(サーバー側)

サーバー側の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通信(クライアント側)

クライアント側の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 
Hello

上記の例は、文字列を標準入力すると、他のクライアントに文字列を送信することができます。

Helloという文字列を送信できました。

PythonによるWebSocket実行例

PythonによるWebSocketの実行例を紹介します。
上記のソースコードを利用して、WebSocket通信を実行します。

WebSocketサーバーを実行

WebSocketサーバーを実行します。

実行例

$ uvicorn python-websocket-server:app --reload

WebSocketサーバーを起動します。

WebSocketクライアント1を実行

WebSocketクライアント1を実行します。

実行例

$ python3 -B python-websocket-client.py 

WebSocketクライアント1を実行して、サーバーと接続します。

WebSocketクライアント2を実行

WebSocketクライアント2を実行します。

実行例

$ python3 -B python-websocket-client.py 

WebSocketクライアント2を実行して、サーバーと接続します。

WebSocketクライアント1で文字列を入力して送信

WebSocketクライアント1で文字列を入力して送信します。

実行例

Hello

文字列を入力して、サーバーにWebSocketで送信します。

WebSocketクライアント2で文字列を受信

WebSocketクライアント2で文字列を受信します。

実行例

Hello

文字列をサーバーからWebSocketで受信します。

まとめ

PythonのWebSocketの使い方を紹介しました。

PythonのWebSocketは
  • 双方向で通信できる
  • サーバー経由で通信できる

PythonによるWebSocketでは、サーバー経由で通信でき、双方向で通信することができます。
双方向での通信が必要なアプリケーションを作成する際に最適な通信方式です。
チャットアプリに最適な通信方式のため、チャットアプリを自作したい場合に採用すると良いです。

  • URLをコピーしました!
目次