web-dev-qa-db-ja.com

WebSocketがクローズコード1006で閉じた理由を取得する

Websocketが閉じられた理由を知りたいので、正しいメッセージをユーザーに表示できます。

私は持っています

sok.onerror=function (evt) 
     {//since there is an error, sockets will close so...
       sok.onclose=function(e){
           console.log("WebSocket Error: " , e);}

コードは常に1006で、理由は常に「」です。しかし、私はさまざまな閉鎖理由を区別して伝えたいと思います。

たとえば、コマンド行には「データベースを使用できないため、削除できません」というエラー理由が表示されます。ただし、Chromeのコンソールでは、理由はまだ「」です。

別の終了理由を区別する他の方法はありますか?

63
slevin

Close Code 1006 は、ブラウザ実装によって接続が異常に(ローカルに)閉じられたことを意味する特別なコードです。

ブラウザクライアントが終了コード1006を報告する場合、詳細についてはwebsocket.onerror(evt)イベントを確認する必要があります。

ただし、Chromeは、近いコード1006の理由をjavascript側に報告することはほとんどありません。これは、WebSocketの悪用を防ぐためのWebSocket仕様のクライアントセキュリティルールが原因である可能性があります。 (宛先サーバーで開いているポートをスキャンしたり、サービス拒否攻撃のために多数の接続を生成したりするなど)。

WebsocketへのHTTPアップグレード中にエラーが発生した場合、Chromeはしばしばクローズコード1006を報告することに注意してください(これはWebsocketが技術的に「接続」される前のステップです)。認証または承認が不適切である、またはプロトコルの使用が不適切(サブプロトコルを要求するが、サーバー自体が同じサブプロトコルをサポートしていないなど)、またはWebsocketではないサーバーの場所と通信しようとする( ws://images.google.com/への接続試行など)

基本的に、閉じるコード1006が表示された場合、websocket自体に非常に低いレベルのエラーがあります(「ファイルを開くことができません」または「ソケットエラー」に似ています)。コードと実装の低レベルの問題に。低レベルの問題を修正し、接続したら、より合理的なエラーコードを含めることができます。これは、プロジェクトの範囲または重大度の観点から達成できます。例:情報と警告レベルはプロジェクト固有のプロトコルの一部であり、接続を終了させません。プロジェクトのプロトコルを使用して必要な詳細を伝達し、WebSocketクローズフローの限られた機能を使用して接続を閉じることにより、重大または致命的なメッセージを報告します。

WebSocketクローズコードは非常に厳密に定義されており、クローズ理由フレーズ/メッセージは123文字を超えることはできません(これは意図的なWebSocketの制限です)。

しかし、すべての情報が失われるわけではありません。デバッグの理由、クロージャーの詳細、およびその根本的な理由のためにこの情報が必要な場合は、Chromeのjavascriptコンソールでかなりの詳細が報告されることがよくあります。

94
Joakim Erdfelt

ChromeがWebSocket標準に準拠していない場合がこれに該当するようです。 サーバーがクローズを開始するでクライアントにクローズフレームを送信すると、Chromeはこれをエラーと見なし、コード1006で理由メッセージなしでJS側に報告します。私のテストでは、Chromeはサーバー起動のクローズフレーム(コード1000を閉じる)に応答しません。コード1006は、おそらくChromeが内部エラーを報告していることを意味します。

追伸Firefox v57.00はこのケースを適切に処理し、サーバーの理由メッセージをJS側に正常に配信します。

4
user10663464

クライアントとしてChromeを使用し、nginxプロキシの下でサーバーとしてgolang gorilla websocketを使用しているときにエラーが発生しました

また、x秒ごとにサーバーからクライアントに「ping」メッセージを送信するだけで解決された問題

1
BIOHAZARD

私の、そしておそらく@BIOHAZARDの場合、それはnginx proxy timeoutでした。デフォルトでは、ソケットでアクティビティがない60秒です

nginxで24時間に変更し、問題を解決しました

proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
0
MixerOID