コンテンツにスキップ

WebSocket

出典: フリー教科書『ウィキブックス(Wikibooks)』

WebSocketは、Webブラウザとサーバー間で双方向通信を可能にする技術であり、HTTPプロトコルの制限を超えたリアルタイム通信を実現します。このハンドブックでは、WebSocketの基本的な使い方から、実際のアプリケーションでどのように活用するかについて詳しく説明します。

概要

[編集]

WebSocketは、以下の特徴を持つプロトコルです:

  • 双方向通信 - サーバーとクライアントが常に接続された状態で、データを自由に送受信できます。
  • 低遅延 - 通常のHTTPリクエスト/レスポンスのオーバーヘッドがないため、高速で効率的な通信が可能です。
  • イベント駆動型 - クライアントおよびサーバーは、接続状態を維持したままイベントを基に通信します。

WebSocketは、主にリアルタイム通信を必要とするアプリケーション(例えば、チャットアプリ、ゲーム、株価表示、通知システムなど)に使用されます。

WebSocketの仕組み

[編集]

WebSocketは、HTTPを使って初期の接続を行い、その後、HTTP接続をWebSocketプロトコルに切り替えて、双方向通信を行います。

接続の流れ

[編集]
  1. ハンドシェイク: クライアントがHTTPリクエストをサーバーに送信し、サーバーはWebSocket接続を承認します。
  2. 接続確立: サーバーが接続を承認すると、クライアントとサーバーはWebSocketプロトコルに切り替わり、データ交換を開始します。
  3. データ交換: 接続が維持されている間、クライアントとサーバーは自由にメッセージを交換します。
  4. 接続終了: クライアントまたはサーバーが接続を終了する際、WebSocketは終了メッセージを交換して接続を閉じます。

WebSocketのインストールと設定

[編集]

WebSocketを使用するためには、サーバー側とクライアント側の設定が必要です。

サーバー側

[編集]

サーバー側でWebSocketを設定するには、Node.jsを使用する場合、wsというパッケージを使うのが一般的です。

npm install ws

サーバー側の基本的な実装例を以下に示します。

// 必要なモジュールをインポート
const WebSocket = require("ws");
const wss = new WebSocket.Server({ port: 8080 });

wss.on("connection", ws => {
    console.log("クライアントが接続しました");

    // メッセージ受信
    ws.on("message", message => console.log("受信メッセージ:", message));

    // クライアントへのメッセージ送信
    ws.send("接続が確立しました");
});

クライアント側

[編集]

クライアント側では、WebSocketオブジェクトを使用してサーバーに接続します。

// サーバーに接続
const ws = new WebSocket("ws://localhost:8080");

ws.onopen = _ => {
    console.log("サーバーに接続しました");

    // サーバーにメッセージ送信
    ws.send("こんにちは、サーバー");
};

ws.onmessage = event => console.log("サーバーからのメッセージ:", event.data);
ws.onclose   = _     => console.log("接続が閉じられました");
ws.onerror   = error => console.log("エラー発生:", error);

WebSocketの特徴と利点

[編集]

WebSocketは、HTTPと比較して以下のような特徴と利点があります:

  • 低レイテンシ: 常に接続が維持されているため、データの送受信が即座に行えます。
  • 効率的な通信: クライアントとサーバー間で頻繁に通信が発生する場合、WebSocketはオーバーヘッドを最小限に抑え、効率的にデータを送受信できます。
  • リアルタイム更新: クライアントはサーバーからのプッシュ通知をリアルタイムで受け取ることができ、最新の情報を常に表示できます。

使用例

[編集]

WebSocketは、以下のようなアプリケーションに適しています:

  • チャットアプリケーション - ユーザー間のリアルタイムメッセージ送受信。
  • ゲーム - ゲームの状態をリアルタイムで同期。
  • 通知システム - サーバーからのリアルタイム通知(株価更新、ニュースフィードなど)。
  • ライブデータストリーミング - スポーツのスコア、株式市場のデータなど。

チャットアプリの例

[編集]

以下は、WebSocketを使ったシンプルなチャットアプリケーションの例です。

// サーバー側
const WebSocket = require("ws");
const wss = new WebSocket.Server({ port: 8080 });

wss.on("connection", ws => {
    ws.on("message", message => {
        wss.clients.forEach(client => {
            if (client !== ws && client.readyState === WebSocket.OPEN) {
                client.send(message);
            }
        });
    });
});
// クライアント側
const ws = new WebSocket("ws://localhost:8080");

ws.onopen    = _     => ws.send("ユーザーが接続しました");
ws.onmessage = event => console.log("メッセージ:", event.data);

セキュリティ

[編集]

WebSocket通信はセキュリティ面で注意が必要です。以下の方法でセキュリティを強化できます。

  • WSS (WebSocket Secure): WebSocket通信をSSL/TLSで暗号化することで、通信を安全に保つことができます。接続URLはws://ではなくwss://を使用します。
  • 認証: WebSocket接続前にユーザー認証を行うことで、悪意のあるアクセスを防ぐことができます。
  • 入力の検証: サーバー側でクライアントから送信されたデータを検証し、不正なデータの送信を防ぎます。

WSS (WebSocket Secure) の設定例

[編集]

以下は、wssを使用してSSL/TLS暗号化を有効にする設定の例です。

// 必要なモジュールをインポート
const https = require("https");
const fs = require("fs");
const WebSocket = require("ws");

// SSL証明書を読み込む
const server = https.createServer({
    cert: fs.readFileSync("server.crt"),
    key: fs.readFileSync("server.key")
});

// WebSocketサーバーを作成
const wss = new WebSocket.Server({ server });

// クライアントとの接続処理
wss.on("connection", ws => {
    ws.on("message", message => console.log("受信メッセージ: ", message);
});

// サーバーを起動
server.listen(8080, _ => console.log("WSSサーバーがポート8080で起動しました");

まとめ

[編集]

WebSocketは、リアルタイム通信を実現する強力な技術です。WebSocketを使用することで、従来のHTTP通信の制限を超え、低遅延で効率的な双方向通信が可能になります。このハンドブックを参考にして、WebSocketを活用したアプリケーションを構築してください。

外部リンク

[編集]