1

TCP/IP を使用したカスタム プロトコルを持つ Java クライアント サーバー アプリケーションがあります。デッド ソケット接続の問題により、プロトコル内でハートビートを使用する必要があることがわかりました。

最初からクライアントからサーバーへのハートビートがあり、サーバーは確認応答で応答しています。

最近、クライアントでタイムアウトの問題が発生しました。コードを分析したところ、不明な点がいくつかありました。

1 - ハートビートに最適な方向はどれですか。サーバーの負荷がかかるため、「クライアントからサーバーへ」を選択したと思います。「サーバーからクライアントへ」に変更することを考えていましたが、クライアント コードとサーバー コードの両方を制御できるので、クライアントの時間を浪費することについてそれほど心配する必要はありません。

2 - 接続が双方向で有効であることを証明するために、ハートビートを確認する必要がありますか?

どうもありがとう

4

1 に答える 1

0

どちらの方向のトラフィックでも、それを維持するには十分だと思いますが、「ping」と「pong」で応答しても問題はありません。伝統的に、クライアントはハートビートを送信し、サーバーは応答しないクライアントをシャットダウンする責任があるため、あなたが持っているものは正しく聞こえます.

タイムアウトをゼロに設定してみましたか?ソケット接続のタイムアウトを妨げているのは、ネットワーク デバイスでしょうか?

try {
  ServerSocket server = new ServerSocket(2048);
  server.setSoTimeout(0); // never time out
  try {
    Socket s = server.accept(  );
    // handle the connection
    // ...
  }
  catch (InterruptedIOException e) {
    System.err.println("No connection within 30 seconds");
  }
  finally {
    server.close(  );
  }
catch (IOException e) {
  System.err.println("Unexpected IOException: " + e);
}
于 2011-08-11T22:41:10.073 に答える