【JS応用|初心者向け】WebSocket通信を正しく終了させる!WebSocket.prototype.closeの正しい使い方

1. 導入:なぜWebSocketの「切断」が重要なのか

リアルタイム通信を行うWebSocketにおいて、接続を開始するのは簡単ですが、終了処理を適切に行うことは非常に重要です。通信が終わったのに接続を放置しておくと、サーバー側のリソースを無駄に消費してしまい、パフォーマンスの低下や予期せぬエラーの原因になります。この記事では、WebSocketの接続を安全かつ確実に切断するためのAPI「WebSocket.prototype.close」について解説します。

2. 基礎知識:WebSocketの終了処理とは

WebSocketは、ブラウザとサーバーの間で「一度接続したら開きっぱなし」にする仕組みです。そのため、タブを閉じたりページを遷移したりするだけでは、サーバー側が「まだ接続中」だと判断してしまうことがあります。

WebSocket.prototype.closeメソッドは、サーバーに対して「通信を終了したい」という合図を送るための関数です。このメソッドを呼ぶことで、サーバーとブラウザ間で「ハンドシェイク(握手)」を交わして、礼儀正しく接続を閉じる(クローズフレームを送る)ことができます。

3. 実装・解決策:closeメソッドの引数

closeメソッドは、引数を指定することで「なぜ切断するのか」という情報をサーバーに伝えることができます。

・第一引数(コード):終了ステータスコード(正常終了なら1000など)
・第二引数(理由):切断の理由を示す短い文字列

一般的に、正常に通信を終える場合は1000を指定します。

4. サンプルプログラム

以下は、WebSocket接続を確立し、ボタンを押すと安全に切断するシンプルな例です。

// WebSocketの接続を開始
const socket = new WebSocket('ws://example.com/socket');

// 接続が確立した時の処理
socket.onopen = () => {
  console.log('接続が完了しました');
};

// 接続が切断された時の処理
socket.onclose = (event) => {
  console.log(`接続が閉じられました。コード: ${event.code}, 理由: ${event.reason}`);
};

// 接続を安全に終了させる関数
function closeConnection() {
  // 1000は「正常終了」を意味する標準的なコードです
  // 第二引数に理由を文字列で渡すことができます
  socket.close(1000, 'ユーザーが操作を終了しました');
}

// 実行例:何らかのイベント(ボタンクリックなど)で呼び出す
// closeConnection();

5. 応用・注意点:現場で役立つポイント

現場でよくある失敗として「closeメソッドを呼んだ直後に、まだ通信しようとする」ケースがあります。

注意点1:状態を確認する
socket.close()を呼び出した後、接続状態は「CLOSING(閉じている途中)」になります。完全に閉じた状態は「CLOSED」です。readyStateプロパティで現在の状態を確認し、接続が完全に閉じてから次の処理に移るように設計しましょう。

注意点2:エラーハンドリング
サーバー側で予期せぬ切断が起きた場合、onerrorイベントが発生します。closeメソッドを呼ぶだけでなく、oncloseとonerrorの両方を監視して、ユーザーに適切なフィードバックを返すようにしてください。

正しく切断処理を行うことで、より堅牢でサーバーに優しいWebアプリケーションを作ることができます。ぜひ活用してみてください。

タイトルとURLをコピーしました