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 になります。
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の他の関連記事もぜひご覧ください! 以下もご興味があるかもしれません:
|
<<: Linux に setup.py プログラムをインストールする方法
>>: Linux に Python クローラー スクリプトを展開し、スケジュールされたタスクを設定する方法
Alibaba Cloud Image Repositoryを使用して外部イメージをダウンロードする...
Docker デーモンは、 HTTP_PROXY 、 HTTPS_PROXY 、およびNO_PRO...
まずエラーコードを見てみましょう。 html: <テーブルボーダー="1"...
目次1. 直接譲渡2. 浅いコピー3. ディープコピー1. JSONオブジェクトメソッド2. 再帰コ...
Superset は、エレガントなインターフェースとデータ テーブルに基づく動的なデータ生成を主な機...
昨日、1年間使用していた Alibaba Cloud サーバーを購入しました。システムは Linux...
目次1:mysql実行プロセス1.1: コネクタ1.2: キャッシュ1.3: アナライザー1.4: ...
以前、Docker コンテナの起動後にボリュームをマウントできるかどうか尋ねられたことがあります。m...
この記事では、CSS を理解し始めたばかりの人を対象に、主に HTML で clearfix と c...
Nginx はネストされた if ステートメントをサポートしておらず、if ステートメントでの論理判...
環境Linux 3.10.0-693.el7.x86_64 Docker バージョン 18.09.0...
MySQL にリモートでログインする場合、使用するアカウントには特別な要件があります。アカウントのデ...
クエリを最適化するExplain ステートメントを使用してクエリ ステートメントを分析するExpla...
以前書いた内容が詳細さに欠けていたため、今回は修正・補足しました。ただし、以前の MySQL バージ...
HTMLコード: <a onclick="goMessage();" st...