1. ホーム
  2. javascript

[解決済み] ウェブソケットで接続損失を処理する

2022-02-19 22:32:57

質問

私は最近、ローカルのWebSocketサーバーをセットアップしました。それはうまく動作しますが、私は、クライアントまたはサーバーが意図的に開始したものではない突然の接続の喪失、すなわち、サーバーが電源を失った、イーサネットケーブルを引き抜いた、などの処理方法を理解していないことに少し困っています。私は、クライアントが10秒以内に接続が失われたかどうかを知る必要があります。

クライアント側、単に接続されている。

var websocket_conn = new WebSocket('ws://192.168.0.5:3000');

websocket_conn.onopen = function(e) {
    console.log('Connected!');
};

websocket_conn.onclose = function(e) {
    console.log('Disconnected!');
};

私は手動で接続の切断をトリガーすることができ、うまくいきます。

websocket_conn.close();

しかし、単にイーサネットケーブルをパソコンの背面から抜いたり、接続を無効にしたりすると onclose は呼ばれない。他の投稿で、最終的に呼び出されるのは、以下の場合だと書いてありました。 TCPが接続の喪失を検出 しかし、Firefoxのデフォルトは10分なので、私が必要とするタイムリーな方法ではなく、私は本当に何百ものコンピュータを回りたくはありません about:config この値を変更します。私が読んだ唯一の提案は、'ping/pong' keep-alive ポーリングスタイルのメソッドを使用することですが、これはウェブソケットのアイデアに直感的でないように思われます。

このような切断の動作を検出する簡単な方法はありますか?私が読んでいる古い記事は、技術的にまだ最新で、最適な方法はまだ「ping/pong」スタイルなのでしょうか?

解決方法は?

これは、私のプロジェクトのセットアップに特化したもので、私の質問で言及されていない基準があることに依存しています。

ウェブソケットサーバーへの接続はFirefoxアドオン内で行われ、デフォルトでFirefoxのTCP設定には10分のタイムアウトがあります。詳細については about:config をクリックし、TCPを検索してください。

Firefoxアドオンはこれらのパラメータにアクセスすることができます。

var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);

また、これらのパラメータを変更するには、新しい値とともに branch & 設定を指定します。

prefs.getBranch("network.http.tcp_keepalive.").setIntPref('long_lived_idle_time', 10);

このため、アドオンがインストールされているコンピュータでは、TCP接続のタイムアウトが10秒に設定されています。接続が切断されると onclose イベントが発生し、アラートが表示され、接続の再確立が試みられます。

websocket_conn.onclose = function (e) {
    document.getElementById('websocket_no_connection').style.display = 'block';
    setTimeout(my_extension.setup_websockets, 10000);
};