web-dev-qa-db-ja.com

ブラウザからwebsocket ping / pongフレームを送信する

接続を維持するために、websocketのping/pongメッセージについて読み続けていますが、それらが何であるかはわかりません。それは明確なフレームタイプですか? (ピンポンに関連するchromeのjavascript WebSocketオブジェクトのメソッドは表示されません)。または、単なるデザインパターンですか(たとえば、文字通り「ping」またはその他の文字列をサーバーに送信し、応答させます)。ピンポンは継続フレームに関連していますか?

私が尋ねる理由は、Mongrel2の背後で実行されるpythonフレームワークを使用しているため、Mongrel2に特定のping/pongメッセージを送信して接続を維持するように指示する方法があるかどうかですpythonアプリを気にする必要はありません。別のHTTPメソッドを使用することに似ています。専用のping/pongメッセージフレームは、文字列「ping」よりも単純(サーバーとネットワークへの負荷が少ない)になると思いますが、おそらくそれほど重要ではありません。

編集: RFC 6455 を見たところ、PingとPongは独自のオペコードを持つフレームタイプを確実に制御しているようです。それでは、ChromeのjavascriptからPingフレームを送信するにはどうすればよいですか?

115
danny

Pingフレームを送信したり、pongフレームを受信したりするためのJavascript APIはありません。これはブラウザでサポートされているか、サポートされていません。また、ブラウザーがping/pongフレームをサポートし、使用しているかどうかを有効化、構成、または検出するAPIもありません。 Javascript ping/pong APIの作成に関する議論 がありました。 pingは将来的に設定可能/検出可能になる可能性がありますが、Javascriptがping/pongフレームを直接送受信できる可能性は低いです。

ただし、クライアントコードとサーバーコードの両方を制御する場合は、より高いレベルでping/pongサポートを簡単に追加できます。まだ持っていない場合は、メッセージに何らかのメッセージタイプヘッダー/メタデータが必要ですが、それは非常に簡単です。 1秒あたり数百回pingを送信することを計画している場合、または数千の同時クライアントがある場合を除き、オーバーヘッドはごくわずかです。

105
kanaka

Pingはサーバーからクライアントにのみ送信されることを意図しており、ブラウザーはPong OpCodeを使用してできるだけ早く自動的に応答する必要があります。したがって、より高いレベルでそれについて心配する必要はありません。

すべてのブラウザが想定どおりに標準をサポートしているわけではありませんが、そのようなメカニズムの実装には多少の違いがあり、ポン応答機能がないことさえ意味します。しかし、個人的に私はPing/Pongを使用していますが、このタイプのOpCodeおよび低レベルのクライアント側実装での自動応答を実装していないクライアントを見たことはありません。

21
moka