学習進捗 0h / 60h (0%)
レッスン phase1-websocket-states
初級 30分

WebSocket状態とライフサイクル

📋 前提知識

WebSocket基本概念ブラウザ開発者ツールの使用

📚 WebSocket状態の基礎知識

ReadyState の4つの状態

🔄
0: CONNECTING
接続確立中(ハンドシェイク中)
1: OPEN
接続が確立され、通信可能
2: CLOSING
切断処理中(クローズハンドシェイク中)
3: CLOSED
接続が切断済み

イベントハンドラとの関係

onopen イベント
CONNECTING → OPEN 時に発火
onmessage イベント
OPEN 状態でのみメッセージ受信
onclose イベント
CLOSING → CLOSED 時に発火
onerror イベント
エラー発生時、状態遷移前に発火

🌐 接続先サービスの選択

Phase 1では公開WebSocketサービスを使用します。異なるサービスで状態遷移を比較してみましょう。

🔍 リアルタイム状態可視化

実際のWebSocket接続で状態変化を観察しましょう。ボタンをクリックして接続・通信・切断の流れを体験できます。

🔍 WebSocket状態ライフサイクル

WebSocketの状態変化とライフサイクルをリアルタイムで可視化します。

📊 現在の状態

ReadyState
3
CLOSED
接続メトリクス
0
送信
0
受信
100%
安定性

🔄 WebSocketライフサイクル

状態遷移図
🔄 new WebSocket(url)
🔄 onopen event
🔄 onerror event
close() or server close
onclose event
Abnormal closure
状態履歴
接続を開始すると状態変化が記録されます

📋 ReadyState一覧

0 🔄
CONNECTING
1
OPEN
2
CLOSING
3
CLOSED

🔒 主要なClose Code

1000 Normal Closure
1001 Going Away
1002 Protocol Error
1003 Unsupported Data
1005 No Status Received
1006 Abnormal Closure
1007 Invalid Frame Payload Data
1008 Policy Violation
1009 Message Too Big
📚 学習ポイント
  • • WebSocketの4つの状態(CONNECTING → OPEN → CLOSING → CLOSED)
  • • 状態遷移のタイミングとイベントハンドラの関係
  • • 正常なクローズハンドシェイクと異常切断の違い
  • • Close Codeによる切断理由の識別
  • • onopen, onmessage, onclose, onerrorイベントの役割

🎯 重要な学習ポイント

状態遷移の理解

  • • CLOSED → CONNECTING: new WebSocket() 呼び出し時
  • • CONNECTING → OPEN: ハンドシェイク成功時
  • • OPEN → CLOSING: close() 呼び出しまたはサーバー側切断
  • • CLOSING → CLOSED: クローズハンドシェイク完了時
  • • 任意状態 → CLOSED: エラーまたは異常切断時

実装時の注意点

  • • readyState を確認してからメッセージ送信
  • • エラーハンドリングの重要性
  • • 再接続ロジックの実装戦略
  • • Close Code による適切な処理分岐
  • • ユーザーへの状態フィードバック

💻 実装例

WebSocket状態を管理する基本的なパターンを学習しましょう。

// WebSocket状態管理の基本パターン
class WebSocketManager {
  constructor(url) {
    this.url = url;
    this.ws = null;
    this.reconnectAttempts = 0;
    this.maxReconnectAttempts = 3;
  }

  connect() {
    if (this.ws?.readyState === WebSocket.OPEN) {
      console.log('Already connected');
      return;
    }

    this.ws = new WebSocket(this.url);
    
    this.ws.onopen = () => {
      console.log('Connected (ReadyState: 1)');
      this.reconnectAttempts = 0;
    };
    
    this.ws.onmessage = (event) => {
      console.log('Message received:', event.data);
    };
    
    this.ws.onclose = (event) => {
      console.log(`Closed (Code: ${event.code}, ReadyState: 3)`);
      this.handleReconnect(event.code);
    };
    
    this.ws.onerror = () => {
      console.log('Error occurred');
    };
  }

  send(message) {
    if (this.ws?.readyState === WebSocket.OPEN) {
      this.ws.send(message);
    } else {
      console.log('Cannot send: WebSocket not open');
    }
  }

  handleReconnect(closeCode) {
    // Close code による再接続判断
    if (closeCode === 1000 || closeCode === 1001) {
      return; // 正常終了、再接続不要
    }
    
    if (this.reconnectAttempts < this.maxReconnectAttempts) {
      setTimeout(() => {
        console.log('Attempting reconnect...');
        this.reconnectAttempts++;
        this.connect();
      }, 1000 * Math.pow(2, this.reconnectAttempts)); // 指数バックオフ
    }
  }
}

📝 実習課題

基本課題

  1. 上記の可視化ツールで手動接続→メッセージ送信→切断の流れを3回実行し、状態遷移を観察する
  2. 両方の公開サービス(Echo WebSocket、Postman Echo)で接続テストを行い、応答の違いを比較する
  3. 自動デモ機能を有効にして、完全なライフサイクルを5回観察する

発展課題

  1. ブラウザ開発者ツールのNetworkタブでWebSocketのハンドシェイクヘッダーを確認する
  2. 意図的にネットワークを切断して異常終了時のClose Codeを観察する
  3. 同時に複数の接続を開いて、各接続の独立性を確認する

学習を継続しましょう

次のレッスン
3.2: イベントベース通信モデル
次のレッスンに進む
または Phase 1 概要 に戻って他のレッスンを確認する
💡 学習のコツ
  • • 理解できない部分があれば、前のレッスンに戻って復習しましょう
  • • 実際に手を動かして、コードを書いて確認することが重要です
  • • インタラクティブデモは何度でも試してみてください
  • • 疑問点があれば、参考資料やドキュメントを確認しましょう

WebSocket 実践ガイド について

ブラウザ標準WebSocket APIを中心とした リアルタイムWebアプリケーション実践ガイドです。 TypeScript/JavaScript中級者を対象とした 50-60時間の構造化カリキュラムを提供します。

技術スタック

フロントエンド: SvelteKit + TypeScript
スタイリング: TailwindCSS
ドキュメント: MDsveX
ターゲット: PWA対応のリアルタイムアプリ

© WebSocket 実践ガイド. 学習目的で作成されました。

GitHub
Made with SvelteKit & TailwindCSS