WebSocket
クライアントとサーバー間で双方向のリアルタイム通信を実現するプロトコル
Webリアルタイム
WebSocket とは
WebSocket は、HTTP のハンドシェイクで接続を確立した後、クライアントとサーバー間で双方向のリアルタイム通信を行うプロトコル (RFC 6455) である。HTTP のリクエスト/レスポンスモデルと異なり、サーバーからクライアントへ能動的にデータを送信できる。
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 との使い分け
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;
}
現場での応用を知るには関連書籍も役立つ。
この記事は役に立ちましたか?
関連用語
WebSocket API
API Gateway の WebSocket API でサーバーレスなリアルタイム双方向通信を実現する仕組み
ロングポーリング
サーバーがデータの準備ができるまでレスポンスを保留し、擬似的なリアルタイム通信を実現する手法
SSE
サーバーからクライアントへ一方向のリアルタイムデータストリームを HTTP で送信する仕組み
GraphQL Subscription
GraphQL でサーバーからクライアントへリアルタイムデータ更新を配信する仕組み
TCP 3-way ハンドシェイク
TCP 接続を確立するための 3 段階の手順で、SYN → SYN-ACK → ACK の順で行われる
TCP/IP
インターネット通信の基盤となるプロトコル群で、データの分割・送信・再組立を信頼性高く行う