3

サーバー/クライアント アプリケーションを少し書きました。ここにコードがあります

try 
{
   OutputStream os = clientSocket.getOutputStream();
   ObjectOutputStream oos = new ObjectOutputStream(os);   
   System.out.println("clientsocketstatus connected: " + clientSocket.isConnected());
   System.out.println("clientsocketstatus closed: " + clientSocket.isClosed());
   oos.writeObject(keepAliveNW); 
} 
   catch(Exception e) 
{ 
   e.printstacktrace(); 
}

Windows で NIC を無効にし、netstat を再度有効にすると、PC1 と PC2 の間に開いている接続が表示されません。クライアントが keepAliveNW オブジェクトを送信しようとすると、例外が発生するはずですが、何も発生しません。有線接続しました。サーバーにデータが到着しません。また、クライアントでWiresharkしました。Keep-Alive パケットは送信されますが、TCP ACK パケットはまったくないため、Java は何か問題があることを検出する必要があります。接続が完全に確立されると、キープアライブ パケットの後に TCP ACK パケットが存在するはずです。では、接続が切断されたことをどのように検出できますか?

手伝ってくれてありがとう。

4

1 に答える 1

-1

キープアライブ セグメントを送信した後、確認応答が受信されない場合、TCP は再送信し、十分な数の受信確認が行われると、呼び出し元のアプリケーションにエラーを報告します。

ACK をトリガーする長さ 0 のメッセージを送信することで、非アクティブな接続が引き続き存在することを確認できます。これは、一部のプラットフォームで利用可能な OS レベルのキープアライブ機能に似ていますが、アプリケーションの必要な頻度に合わせて調整できます。

于 2013-01-19T20:49:48.580 に答える