🌐
WebSocket 超入門
0. このガイドの読み方
-
対象: 「聞いたことはあるけどピンと来ていない方」「HTTP は知ってるけど“常時接続”って何?」というレベルのエンジニア・企画職・学生…誰でも OK。
-
ゴール: 読み終わる頃には「自分でもチャットアプリを動かせそう」と思えるだけの 概念理解+最低限の実装力 を身につけます。
-
スタイル:
- できるだけ 平易な言葉 を使用。
- カタカナ語には必ず(かっこ)で日本語 or 具体例を付けていきます。
- 「なぜ?」→「どうする?」→「気をつける点」という三段構成で進行。
1. まず “リアルタイム通信” とは?
1-1. イメージで理解
-
従来の HTTP = “手紙”
- 手紙を書いてポスト(サーバー)に出し、返事を待つ。
- 一往復ごとに封をして配達するので時間と労力がかかる。
-
WebSocket = “電話”
- いったん受話器を取ったら、切るまで しゃべり放題&聞き放題。
- 追加の手続き不要で相手の声(データ)がすぐ届く。
リアルタイム通信 = “電話” のように 待ち時間ほぼゼロで情報をやり取り できるしくみ。
1-2. どんな場面で役立つ?
例 | どう便利? |
---|---|
チャット | 入力した瞬間、相手の画面に表示。 |
株価・仮想通貨 | 銘柄の値動きを秒単位で反映。 |
オンラインゲーム | プレイヤーの位置や攻撃をリアルタイム同期。 |
IoT センサー | 温度・湿度などの最新値を常時監視。 |
2. WebSocket のしくみを 5 分で
2-1. “ハンドシェイク” ――まずは名刺交換
-
ブラウザが「WebSocket を始めたい!」と HTTP でリクエスト。
-
サーバーが「OK、これからは WebSocket で話そう」と返事。
- ここで
Upgrade: websocket
ヘッダーをやり取り。
- ここで
-
お互い合意したら 電話回線(ソケット)を開通。この時点からは HTTP ではなく WebSocket 規格に従って通信。
2-2. “データフレーム” ――小包みたいなデータの箱
- 通信は フレーム(ヘッダー+本体)単位で行う。
- ヘッダーが最小 2〜14 バイト程度と超軽量 → レイテンシ(遅延)減少。
- テキストだけでなく バイナリ(画像・音声など)の箱も送れる。
2-3. 接続の維持と終了
- 片方が
close
フレームを送る or ネットワークが切れるまで 常時つながったまま。 - 長時間つなぎっぱなしなので 心臓の鼓動のように「Ping↔Pong」で生存確認を行う。
3. 実装してみよう(最小構成)
3-1. クライアント(ブラウザ側)
<script>
const ws = new WebSocket("ws://localhost:8080");
ws.addEventListener("open", () => {
console.log("接続 OK");
ws.send("こんにちはサーバー!");
});
ws.addEventListener("message", (e) => {
console.log("受信:", e.data);
});
ws.addEventListener("close", () => console.log("接続終了"));
ws.addEventListener("error", (err) => console.error(err));
</script>
3-2. サーバー(Node.js + ws ライブラリ)
# 事前インストール
npm install ws
import { WebSocketServer } from 'ws';
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', (socket) => {
console.log('クライアント接続');
socket.on('message', (msg) => {
console.log('受信:', msg.toString());
socket.send('こちらサーバーです!');
});
socket.on('close', () => console.log('切断'));
});
3 分で動くデモ: 上記サーバーを起動 → 任意の HTML ファイルにクライアントスクリプトを貼り付け → ブラウザを開く。
4. メリット・デメリットを正直に
4-1. メリット
- 爆速: 一度つながればヘッダーが小さく遅延ほぼゼロ。
- 双方向: サーバー → クライアントにも即時プッシュ。
- 経済的: Polling のように “無駄なリクエスト連打” が不要。
- バイナリ OK: 画像や音声も送れる。
4-2. デメリット
課題 | 対策のヒント |
---|---|
コードが複雑 | ライブラリ(Socket.IO など)で抽象化。 |
常時接続ゆえの DoS 攻撃 | コネクション数制限・レートリミット。 |
プロキシ・ファイアウォールが遮断する場合あり |
wss:// (TLS)を使う、ポート 443 利用。 |
5. 他方式との比較
方式 | 通信方向 | 接続維持 | 主な用途 |
---|---|---|---|
Polling | クライアント → サーバー | いいえ | 小規模でも実装がラク |
Long Polling | 同上(レスポンス長持ち) | 条件付き | 古いチャット、通知 |
SSE (Server‑Sent Events) | サーバー → クライアント のみ | はい | 株価ティッカーなど |
WebSocket | 双方向 | はい | ゲーム、チャット、IoT |
結論: 双方向 かつ 高頻度 のやり取りなら WebSocket 一択。片方向だけ or 更新頻度が低いなら SSE / Polling で十分。
6. 本番運用でハマらないためのチェックリスト
-
TLS (wss://) を必ず使用。平文 (
ws://
) は盗聴・改ざんリスク大。 - Origin チェック: 予期しないサイトからの接続を拒否。
- 認証トークン をハンドシェイク時 or 接続後すぐ検証。
- バックプレッシャー: 受信量が多すぎるとアプリが落ちる。
- スケーリング: 複数サーバー間でメッセージを中継する場合、Redis などの Pub/Sub を利用。
- モニタリング: 接続数・エラー率・Ping 遅延をダッシュボードで可視化。
7. よくある質問 (FAQ)
Q | A |
---|---|
スマホでも動く? | もちろん。iOS/Android のブラウザやネイティブアプリ用ライブラリあり。 |
何人まで同時接続できる? | 設計次第。1 台で数万コネクション、負荷分散で数十万も可能。 |
HTTP/2 や HTTP/3 とどっちが速い? | HTTP/2,3 も多重化で高速化するが、“常時双方向” では WebSocket が依然有利。 |
動画ストリーミングにも使える? | 可能。ただし大容量は HLS/DASH の方が一般的。 |
8. まとめ 〜“手紙”から“電話”へ〜
- WebSocket は 常時双方向 の “専用電話回線”。
- チャット・ゲーム・IoT など リアルタイム性が命 のアプリに最適。
- 本番では TLS・認証・モニタリング を忘れずに。
これであなたも「WebSocket? ああ、あの電話みたいな通信でしょ」と自信を持って語れます。さっそくローカルで動かし、リアルタイムの世界を体験してみてください。
学びは“動かしてナンボ”。この記事があなたの一歩を後押しできれば幸いです。
Discussion