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のコンソールでは、理由はまだ「」です。
別の終了理由を区別する他の方法はありますか?
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コンソールでかなりの詳細が報告されることがよくあります。
ChromeがWebSocket標準に準拠していない場合がこれに該当するようです。 サーバーがクローズを開始するでクライアントにクローズフレームを送信すると、Chromeはこれをエラーと見なし、コード1006で理由メッセージなしでJS側に報告します。私のテストでは、Chromeはサーバー起動のクローズフレーム(コード1000を閉じる)に応答しません。コード1006は、おそらくChromeが内部エラーを報告していることを意味します。
追伸Firefox v57.00はこのケースを適切に処理し、サーバーの理由メッセージをJS側に正常に配信します。
クライアントとしてChromeを使用し、nginxプロキシの下でサーバーとしてgolang gorilla websocketを使用しているときにエラーが発生しました
また、x秒ごとにサーバーからクライアントに「ping」メッセージを送信するだけで解決された問題
私の、そしておそらく@BIOHAZARDの場合、それはnginx proxy timeout
でした。デフォルトでは、ソケットでアクティビティがない60
秒です
nginx
で24時間に変更し、問題を解決しました
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;