WebSocket

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

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

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 との使い分け

分かれ目は、クライアントからも送る必要があるかどうかである。

用途選ぶ方式理由
チャットやゲームで双方向にやり取りするWebSocket同じ接続でクライアントからも送信できる。サーバーからの一方向しか流れない方式では、操作を送るための経路を別に用意することになる
通知やログをサーバーから流すだけSSE受け取り専用なら双方向の持続接続は要らず、ws:// への切り替えを挟まず HTTP のままで扱える
ダッシュボードの更新送信方向で決める数値を表示し直すだけなら SSE で足りる。画面から購読するチャンネルを切り替えるなら、クライアント発の送信ができる 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;
}

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

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

関連用語

関連する記事