WebSocket

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

Webリアルタイム
WebSocket」の技術書を見る (12 冊) →

WebSocket とは

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

HTTP との比較

HTTP との主な違いを以下に比較する。

観点HTTPWebSocket
方向リクエスト/レスポンス双方向
接続リクエストごとに開閉持続的
オーバーヘッドヘッダーが毎回付く初回ハンドシェイクのみ
プロトコル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 との使い分け

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;
}

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

この記事は役に立ちましたか?

関連用語

関連する記事