1

接続されたソケットからストリームを読み取るソケットサーバーのコードを以下に示します。

try
{
    ObjectInputStream in = new ObjectInputStream(client.getInputStream());
    int count = 10;
    while(count>0)
    {
        String msg = in.readObject().toString(); //Stucks here if this client is lost.
        System.out.println("Client Says : "+msg);
        count--;
    }
    in.close();
    client.close();
}
catch(Exception ex)
{
    ex.printStackTrace();
}

そして、このサーバーに接続し、毎秒10回文字列を送信し、サーバーがソケットから10回読み取り、メッセージを出力するクライアントプログラムを持っていますが、その間にクライアントプログラムを強制終了すると、サーバーがフリーズします例外や何かをスローする代わりに、その間に。

この凍結状態をどのように検出できますか? このループを無限に繰り返し、接続がアクティブで安定するまでクライアントが送信するものを出力しますか?

4

1 に答える 1

2

問題は、クライアント コードがソケットのクライアント側で .close() を呼び出さずに終了し、TCP FIN シグナルを送信しないため、ソケットのサーバー側がクライアント接続が閉じたことを知る方法がないことです。

これを修正する方法の 1 つは、ソケットがまだアクティブかどうかを定期的に検査する新しい Watcher スレッドを作成することです。このアプローチの問題は、ソケットの isConnected() が上記と同じ理由で機能しないため、接続を検査する唯一の実際の方法は、それに書き込みを試みることです。ただし、これにより、リッスンしている可能性のあるクライアントにランダムなガベージが送信される可能性があります。

他のオプションは、クライアントが同意する必要がある何らかのタイプのキープアライブ プロトコルを実装することです (つまり、キープアライブ ビットを頻繁に送信して、ウォッチャーが何かを探す必要があるようにします)。また、java.nio アプローチに移行することもできます。これは、これらの条件に対処するのに適していると思います。

このスレッドは古いですが、詳細を提供しています: http://www.velocityreviews.com/forums/t541628-sockets-checking-for-dropped-connections-and-close.html

于 2012-06-08T17:47:18.687 に答える