1

WebSocket 接続を処理するために Play Framework 2.2.1 を使用しています。

一般に、次の onClose 関数は、(close 関数を呼び出して) クライアントによって意図的に接続が閉じられた場合、またはクライアントがクラッシュした場合などの不要なイベントによって接続が閉じられた場合に呼び出されます。

socketIn.onClose(new F.Callback0() {
                    public void invoke() {
                             // Send a Quit message
                        }
                       });

ここでの問題は、不要なイベントが発生した場合に onClose コールバックが呼び出されないことがあります。サーバーの観点からは、クライアントはまだ接続されているように見えます。この問題を処理する最善の方法は何ですか? クライアントがオンラインであることを確認するために毎秒のようにクライアントにpingを送信する必要がありますか、それともクライアントからサーバーへのpingを実行する必要がありますか?

4

1 に答える 1

2

残念ながら、簡単な解決策はありません。これは、Play の github に関する問題です。具体的には、Play が接続がそれ自体で失われたと推測することはできません。

Play が読み取り/アイドル タイムアウトをサポートするまでは、それらを自分で実装できます。私たちのブラウザー拡張機能は永続的な websocket 接続を維持し、 x秒ごとにアプリケーションレベルの ping を実行します。回線が長時間沈黙している場合、クライアントとサーバーの両方が切断を開始できます。

私は Java websocket API に精通していませんが、抽象的には、サーバーでの最後の通信時間の記録を保持し、スレッド/アクター/スケジュールされたタスクで古い接続をクリーンアップしたいだけです。次に、接続を維持するために、ソケットに対して ping を実行します。クライアントで ping を開始します (ただし、サーバーでも同様に機能します)。サーバーが 2 秒以内に Pong しない場合、クライアントは切断され、再接続されます。

于 2014-02-13T16:59:09.393 に答える