1. プロジェクト概要
本記事では、WebSocketの基本的な概念から、実際にPythonでサーバー・クライアントを作成し、その動作を確認するまでのプロセスを解説します。
後半ではPythonのwebsocketsライブラリを利用して、リアルタイム双方向通信を実現するWebSocketの基本的な動作を学ぶためのサンプルアプリケーションを元に動作を確認しています。
websocketの主な機能は以下の通りです。
- サーバー: 複数のクライアントからの接続を非同期で受け付けます。
- ブロードキャスト: あるクライアントから受信したメッセージを、接続している他の全てのクライアントに一斉に送信します。
- クライアント: サーバーに接続し、メッセージの送信と受信をコンソール上で行います。
2. WebSocketの概要
WebSocketは、単一のTCP接続上で、コンピューターネットワークを介してリアルタイムに双方向通信を行うための通信プロトコルです。
従来のHTTP通信がクライアントからのリクエストに応じてサーバーがレスポンスを返す「リクエスト-レスポンス」モデルであるのに対し、WebSocketは一度接続を確立(ハンドシェイク)すると、サーバーとクライアントのどちらからでも自由にデータを送りあうことができます。
この特性により、チャットアプリケーション、オンラインゲーム、リアルタイム株価情報配信など、低遅延で継続的なデータ交換が求められるアプリケーションに適しています。
2.1. HTTP通信との違い
特徴 | WebSocket | HTTP |
---|---|---|
通信方式 | 双方向通信 (Full-Duplex) | 単方向通信 (Request-Response) |
接続 | 接続を一度確立すると、明示的に閉じるまで維持される。 | リクエストごとに接続と切断を繰り返すのが基本(Keep-Aliveで再利用も可能)。 |
通信の開始 | サーバーとクライアントのどちらからでも開始可能。 | 必ずクライアントからのリクエストで開始される。 |
オーバーヘッド | 通信ヘッダーが非常に小さく、データ量が少ない。 | リクエストごとに比較的大きなヘッダーが付与されるため、オーバーヘッドが大きい。 |
主な用途 | リアルタイム性が高いアプリケーション(チャット、ゲームなど)。 | Webページの閲覧、ファイルのダウンロードなど、コンテンツ取得が主な目的。 |
3. 開発アプリケーション
3.1 各ファイルの役割
ファイル名 | 役割 |
---|---|
server.py |
WebSocketサーバーの本体。クライアントの接続管理、メッセージの受信、全クライアントへのブロードキャスト処理を担います。 |
client.py |
WebSocketクライアントの本体。サーバーへの接続、ユーザーによるメッセージの入力と送信、サーバーからのメッセージ受信と表示を担います。 |
requirements.txt |
プロジェクトが依存するPythonライブラリ(websockets , python-dotenv , aioconsole )をリストアップします。pip install -r requirements.txt で一括インストールが可能です。 |
README.md |
プロジェクトのセットアップ方法、使い方、技術仕様などを記載したドキュメントです。 |
4. ワークフロー図 (Mermaid)
サーバーとクライアント間の通信フローを以下に示します。
ワークフローの実行手順
上記フロー図の動作は、以下の手順で実際に確認することができます。
-
ターミナルを3つ開きます。
- ターミナル1: サーバー用
- ターミナル2: クライアント1用
- ターミナル3: クライアント2用
-
サーバーを起動します。
ターミナル1で、以下のコマンドを実行します。python server.py
サーバーが起動し、
サーバーを起動します: ws://...
と表示されます。 -
クライアント1を接続します。
ターミナル2で、以下のコマンドを実行します。python client.py
サーバー側のターミナル(ターミナル1)に
クライアントが接続しました:...
と表示されます。 -
クライアント2を接続します。
ターミナル3で、以下のコマンドを実行します。python client.py
サーバー側のターミナル(ターミナル1)に、もう一つ
クライアントが接続しました:...
と表示されます。 -
メッセージを送信します。
クライアント1のターミナル(ターミナル2)で、こんにちは
と入力してEnterキーを押します。 -
ブロードキャストを確認します。
- サーバーのターミナル(ターミナル1)に
受信メッセージ: こんにちは
と表示されます。
- クライアント1のターミナル(ターミナル2)に
サーバーからのメッセージ: ... こんにちは
と表示されます。 - クライアント2のターミナル(ターミナル3)に
サーバーからのメッセージ: ... こんにちは
と表示されます。
これにより、メッセージが全クライアントにブロードキャストされたことが確認できます。
- サーバーのターミナル(ターミナル1)に
-
クライアントを終了します。
任意のクライアントのターミナルでexit
と入力すると、そのクライアントが切断されます。サーバー側にはクライアントとの接続が切れました:...
と表示されます。