web-dev-qa-db-ja.com

WebSocketで接続が有効かどうかを確認するにはどうすればよいですか?

ブラウザで実行されているwebappがあります。そのwebappは、websocketを使用するサーバーに接続されています。したがって、サーバーとクライアント/ブラウザ間の通信は、WebSocketに基づいています。サーバーで何らかのマジックイベントが発生した場合、一部のWebサービスが新しいXML/JSONを私のWebアプリケーションに送信し、新しいデータが表示されます。

しかし、クライアント/ブラウザとして、接続がまだ生きているかどうかをどうやって知るのですか?約30秒間新しいXMLを取得しないとしましょう。接続が閉じているか、切断されているか、サーバーがオフラインであるか、またはすべてが正常であるかをサーバーで確認した場合、新しいマジックイベントは発生しませんでした。

19
Gero

3つの方法:

  • TCPに依存して接続の喪失を検出します。これは最終的にJS oncloseイベントでポップアップします
  • サーバーからWebSocket pingを送信します。ブラウザはWS pongsで応答します。接続の切断は、クライアント側でもおそらくより確実に検出されます
  • ブラウザからサーバーにアプリレベルのハートビートを送信します。サーバーには応答するロジックが必要です。ブラウザからWS pingをトリガーできません(JSの場合)
19
oberstet

WebSocket接続オブジェクトにはreadyStateフィールドがあり、接続がまだアクティブであるかどうかを通知します (Dartドキュメントから) 。 readyStateは次のいずれかです。

0 - connection not yet established
1 - conncetion established
2 - in closing handshake
3 - connection closed or could not open

これが処理したい場合(再接続など)、websocket closeイベントのイベントハンドラーを定義することもできます。

24
fuzic