JS WebSocket 切断理由とハートビートの仕組みの詳しい説明

JS WebSocket 切断理由とハートビートの仕組みの詳しい説明

1. 切断理由

WebSocket が切断される理由は多数あります。WebSocket が切断されたときにエラーを出力するのが最適です。

ws.onclose = 関数 (e) {
  console.log('Websocketが切断されました: ' + e.code + ' ' + e.reason + ' ' + e.wasClean)
  コンソール.log(e)
}

エラーステータスコード:

WebSocket が切断されると、CloseEvent がトリガーされます。CloseEvent は、接続が閉じられると WebSocket を使用してクライアントに送信されます。これは、WebSocket オブジェクトの onclose イベント リスナーで使用されます。 CloseEvent のコード フィールドは、WebSocket が切断された理由を示します。このフィールドから切断の理由を分析できます。

CloseEvent には注意が必要な 3 つのフィールドがあります。これら 3 つのフィールドを分析することで、通常は切断の理由を見つけることができます。

CloseEvent.code: codeはエラーコードで、整数型です。

CloseEvent.reason: 理由は切断の理由、文字列

CloseEvent.wasClean: wasClean は切断が正常であったかどうかを示すブール値です。通常、異常な切断が発生した場合、値は false になります。

ステータスコード名前説明する
0~999予約済みセグメント。使用されていません。
1000閉じる_通常正常終了。リンクが作成された目的が何であれ、リンクはタスクを正常に完了しました。
1001閉店サーバー エラーのため、またはブラウザーが接続を開始したページを離れるため、端末は離れます。
1002 CLOSE_PROTOCOL_ERRORプロトコル エラーのため接続が中止されました。
1003閉じる_サポートされていません受け入れられないデータ型が受信されたため、接続が終了しました (例: テキスト データのみを受け入れる端末でバイナリ データが受信された場合)。
1004予約済み。その意味は将来定義される可能性があります。
1005閉じる_ステータスなし予約済み。予期されたステータス コードが受信されなかったことを示します。
1006 CLOSE_異常予約済み。ステータス コードが予期されており、接続が異常終了した場合 (つまり、Close フレームが送信されなかった) に使用されます。
1007サポートされていないデータ指定された形式に準拠していないデータ (UTF-8 以外のデータを含むテキスト メッセージなど) を受信したため、接続が終了しました。
1008ポリシー違反プロトコルに準拠していないデータを受信したため、接続が切断されました。これは、ステータス コード 1003 および 1009 が適切でない状況で使用される一般的なステータス コードです。
1009閉じすぎます大きすぎるデータ フレームを受信したため、接続が終了しました。
1010拡張子がありませんクライアントはサーバーが 1 つ以上の拡張機能をネゴシエートすることを期待していましたが、サーバーがそれらを処理しなかったため、クライアントは切断されました。
1011内部エラークライアントが予期しない状況に遭遇し、要求を完了できなかったため、サーバーは切断されました。
1012サービスの再起動再起動のためサーバーが切断されました。
1013後でもう一度お試しくださいサーバーの過負荷などの一時的な理由によりサーバーが切断されたため、一部のクライアントが切断されました。
1014将来の使用のために WebSocket 標準によって予約されています。
1015 TLS ハンドシェイク保持。TLS ハンドシェイクを完了できなかったため (サーバー証明書を検証できなかったなど)、接続が閉じられたことを示します。
1016–1999将来の使用のために WebSocket 標準によって予約されています。
2000–2999 WebSocket 拡張機能で使用するために予約されています。
3000–3999ライブラリまたはフレームワークで使用できます。アプリケーションでは使用しないでください。先着順で IANA に登録できます。
4000~4999年アプリケーションで使用できます。

2. ハートビートを追加する

var lockReconnect = false; // 繰り返しの ws 接続を回避する var ws = null; // 現在のブラウザが WebSocket をサポートしているかどうかを判断します
var wsUrl = serverConfig.socketUrl;
createWebSocket(wsUrl); //wsに接続

関数createWebSocket(url) {
    試す{
        if('WebSocket' がウィンドウ内にある場合){
            ws = 新しい WebSocket(url);
        }
        イベントハンドルを初期化します。
    }キャッチ(e){
        再接続(url);
        コンソールログ(e);
    }     
}

関数initEventHandle() {
    ws.onclose = 関数(){
        再接続(wsUrl);
        console.log("llws 接続が閉じられました!"+new Date().toLocaleString());
    };
    ws.onerror = 関数(){
        再接続(wsUrl);
        console.log("llws 接続エラー!");
    };
    ws.onopen = 関数(){
        heartCheck.reset().start(); //ハートビート検出のリセット console.log("llws 接続が成功しました!"+new Date().toLocaleString());
    };
    ws.onmessage = function (event) { // メッセージが受信されると、ハートビート検出がリセットされます heartCheck.reset().start(); // メッセージが受信されると、現在の接続が正常であることを意味します console.log("llws はメッセージを受信しました:" + event.data);
        if(event.data!='ポン'){
            data = jsON.parse(event.data); とします。
        }
    };
}
// ウィンドウを閉じるイベントをリッスンします。ウィンドウが閉じられると、Websocket 接続をアクティブに閉じて、接続が切断される前にウィンドウが閉じられたときにサーバーが例外をスローするのを防ぎます。
window.onbeforeunload = 関数() {
    ws.close();
}  

関数 reconnect(url) {
    if(lockReconnect) 戻り値:
    ロック再接続 = true;
    setTimeout(function () { //接続に失敗した場合は、再接続を続けます。リクエストが多すぎるのを避けるために遅延を設定します。createWebSocket(url);
        ロック再接続 = false;
    }, 2000);
}

//ハートビート検出 var heartCheck = {
    timeout: 1000, // 1分ごとにハートビートを送信します timeoutObj: null,
    serverTimeoutObj: null、
    リセット: 関数(){
        タイムアウトをクリアします(this.timeoutObj);
        タイムアウトをクリアします(this.serverTimeoutObj);
        これを返します。
    },
    開始: 関数(){
        var self = this;
        this.timeoutObj = setTimeout(function(){
            //ここでハートビートが送信され、バックエンドがそれを受信すると、ハートビート メッセージが返されます。
            //onmessage は返されたハートビートを取得します。これは接続が正常であることを意味しますws.send("ping");
            console.log("ping!")
            self.serverTimeoutObj = setTimeout(function(){//一定時間後にリセットされない場合は、バックエンドがアクティブに切断したことを意味します ws.close(); //onclose が再接続を実行する場合は、ws.close() を実行する必要があります。再接続が直接実行されると、onclose がトリガーされ、2 回の再接続が発生します}, self.timeout)
        }, this.timeout)
    }
}
    //クライアントメッセージを受信した後に呼び出されるメソッド @OnMessage  
    パブリック void onMessage(String message, Session session) {  
        if (message.equals("ping")) {
        }それ以外{
        。 。 。 。
        }
   }

システムは、Websocket が 1 分ごとに自動的に切断されることを検出しました。多くのブログを検索しましたが、すべて nginx の proxy_read_timeout を設定するように言われていましたが、この時間は長すぎるため、サーバーのパフォーマンスに影響します。ハートビート パケット メソッドを使用すると、クライアントは 1 分ごとにサーバーに ping メッセージを自動送信し、サーバーは pong を返す必要があります。その問題は解決できます。

以上がJS WebSocket切断の原因とハートビートの仕組みについての詳しい説明です。JS WebSocket切断の原因とハートビートの仕組みについてさらに詳しく知りたい方は、123WORDPRESS.COMの他の関連記事もぜひご覧ください!

以下もご興味があるかもしれません:
  • JS WebSocketを使用して簡単なチャットを実装する方法
  • js は、Websocket 経由で mp3 録音のリアルタイム送信とシンプルな波形効果を実現します。
  • ネイティブNode.jsはWebSocketコード共有を使用する
  • node.js で Express ベースの Websocket を使用する方法
  • JSはWebSocketロングポーリングリアルタイムメッセージプロンプトの効果を実装します
  • nodejs+websocket リアルタイム チャット システムの改良版
  • Websocket+node.jsでリアルタイムチャットシステムの問題相談を実装
  • Node.js ベースの WebSocket 通信の実装
  • Node.js websocketはsocket.ioライブラリを使用してリアルタイムチャットルームを実装します
  • Javascript WebSocket の使用例 (簡潔な入門チュートリアル)

<<:  Linux に setup.py プログラムをインストールする方法

>>:  Linux に Python クローラー スクリプトを展開し、スケジュールされたタスクを設定する方法

推薦する

Linux システムの .bash_profile ファイルの詳細な説明

目次1. 環境変数$PATH: 2. 環境変数を変更します。 3. bash_profileの目的要...

Mysql トランザクション分離レベルの読み取りコミットの詳細な説明

MySQL トランザクション分離レベルを表示する mysql> '%isolation...

ウェブページの読み込み進捗状況バーの詳細な説明(推奨)

(Web ページの読み込み中に、コンテンツが多すぎて読み込みと待機が続くことがあります。このとき、...

MySQL で準備、実行、割り当て解除ステートメントを使用するチュートリアル

序文MySQLでは、準備、実行、割り当て解除を正式にはPREPARE STATEMENTと呼びます。...

Docker を使用した nextcloud パーソナル ネットワーク ディスクの構築に関するチュートリアル

目次1. はじめに2. 導入環境ツール4. 展開プロセス要約する1. はじめにNextcloud は...

VUEは底部吸引ボタンを実装

この記事では、VUEの具体的なコードを共有して、下部吸引ボタンを実装する例を紹介します。具体的な内容...

MySQL 自動インクリメント ID 枯渇の例

ディスプレイ定義IDテーブルに定義された自動増分IDが上限に達した場合、次のIDを申請する際に得られ...

Nginx 運用保守ドメイン名検証方法例

インターフェイス ドメイン名を構成する際、各パブリック プラットフォームはドメイン名に対する開発者の...

Centos6.5 glibc アップグレードプロセスの紹介

目次シナリオ要件glibc バージョンglibcのインストールglibc ソフトリンクシナリオ要件C...

UbuntuはSSHサービスのリモートログイン操作を開始します

ssh-secure シェルは、安全なリモート ログインを提供します。組み込みシステムを開発し、Li...

CentOS のクローン作成、Linux 仮想マシンの共有の完全な手順

序文Linux が完全にセットアップされると、クローン機能を使用して短時間で複数の Linux を作...

Windowsにmysql5.7をインストールする方法

まずmysqlの圧縮バージョンをダウンロードします。公式ダウンロードアドレスは123WORDPRES...

MySQLのINサブクエリによってインデックスが使用できなくなる問題を解決する

今日は、MySQL IN サブクエリの最適化に関するケーススタディを見ました。最初は少し懐疑的でした...

CentOS 7.0 (mysql-5.7.21) で複数の MySQL インスタンスを起動する方法

設定手順Linux システム: CentOS-7.0 MySQL バージョン: 5.7.21 Lin...

mysql explain(分析インデックス)の使い方の詳しい説明

EXPLAIN は、MySQL がインデックスを使用して選択ステートメントを処理し、テーブルを結合す...