WebSocket

クライアントとサーバー間で双方向のリアルタイム通信を実現するプロトコル

Webリアルタイム

WebSocket とは

WebSocket は、HTTP のハンドシェイクで接続を確立した後、クライアントとサーバー間で双方向のリアルタイム通信を行うプロトコル (RFC 6455) である。HTTP のリクエスト/レスポンスモデルと異なり、サーバーからクライアントへ能動的にデータを送信できる。

HTTP との比較

観点 HTTP WebSocket
方向 リクエスト/レスポンス 双方向
接続 リクエストごとに開閉 持続的
オーバーヘッド ヘッダーが毎回付く 初回ハンドシェイクのみ
プロトコル http:// / https:// ws:// / wss://
用途 REST API、Web ページ チャット、ゲーム、通知

ハンドシェイク

クライアント  HTTP Upgrade リクエスト  サーバー
  GET /chat HTTP/1.1
  Upgrade: websocket
  Connection: Upgrade

サーバー  101 Switching Protocols  クライアント
  HTTP/1.1 101 Switching Protocols
  Upgrade: websocket

 以降は WebSocket フレームで双方向通信

クライアント側

const ws = new WebSocket('wss://api.example.com/ws');

ws.onopen = () => {
  ws.send(JSON.stringify({ type: 'subscribe', channel: 'notifications' }));
};

ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  console.log('Received:', data);
};

ws.onclose = (event) => {
  console.log(`Closed: ${event.code} ${event.reason}`);
  // 再接続ロジック
};

SSE との使い分け

ケース 推奨
チャット、ゲーム (双方向) WebSocket
通知、ログストリーム (サーバー→クライアント) SSE
ダッシュボードの更新 SSE or WebSocket

再接続の実装

WebSocket は接続が切れることがある。指数バックオフで再接続する。

function connect(url: string, delay = 1000) {
  const ws = new WebSocket(url);
  ws.onclose = () => {
    setTimeout(() => connect(url, Math.min(delay * 2, 30000)), delay);
  };
  return ws;
}

現場での応用を知るには関連書籍も役立つ。

関連用語