151

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

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

編集:RFC 6455を見たところ、PingとPongは間違いなく独自のオペコードを持つコントロールフレームタイプのようです。では、ChromeでJavaScriptからPingフレームを送信するにはどうすればよいですか?

4

3 に答える 3

138

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

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

于 2012-05-14T15:41:30.463 に答える
16

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

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

于 2012-05-15T09:40:47.447 に答える
4

jsで可能な解決策

WebSocketサーバーイニシアチブwsが数分後にリンクを切断した場合、サーバーとクライアントの間でメッセージは送信されませんでした。

  1. クライアントエンドイニシアチブはカスタムメッセージを送信し、関数pingを使用して存続しますkeepAlive

  2. サーバー側はカスタムメッセージを無視し、カスタムメッセージpingに応答しますpong

let timerId = 0; 

function keepAlive(timeout = 20000) { 
    if (webSocket.readyState == webSocket.OPEN) {  
        webSocket.send('');  
    }  
    timerId = setTimeout(keepAlive, timeout);  
}

function cancelKeepAlive() {  
    if (timerId) {  
        clearTimeout(timerId);  
    }  
}

于 2020-11-03T07:51:00.260 に答える