10

TCP/IP 経由でサードパーティのデバイスをホストするサーバーを開発しており、突然接続が切断されました (デバイスはセルラー経由で接続しています)。デバイス自体にデータを書き込まずに切断を検出する方法を見つける必要があります。

TCP キープアライブ機能の使用を検討しましたが、Java ではキープアライブ操作のタイミングを調整できないようです。

これを行うための推奨される方法はありますか?

私の簡略化されたソケットコードは次のとおりです。

public class Test2Socket {
    public static void main(String[] args) {
        try {
            ServerSocket skt = new ServerSocket(1111);

            Socket clientSocket = skt.accept();

            clientSocket.setKeepAlive(true);

            System.out.println("Connected..");

            BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

            String inputLine;

            while((inputLine = input.readLine()) != null)
            {
                System.out.println(inputLine);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

どんなフィードバックでも大歓迎です。

4

5 に答える 5

4

TCP Keep-Alive の詳細については、こちらの回答を参照してください。

しかし、基本的には、TCP Keep-Alive が古い接続を検出するための最良の方法である可能性があります。主な問題は、接続が実際に切断される前に、接続がチェックされる 2 時間前に OS のデフォルトが設定され、キープアライブ パケットがさらに 11 分かかることです。

TCP に既に組み込まれている場合は、アプリケーション層の Keep Alive プロトコルを独自に記述しないでください。必要なのは、TCP タイムアウトを 2 ~ 3 分などのより適切な値に設定することだけです。

残念ながら、TCP タイムアウトは JVM 内からではなく OS レベルで管理されるため、ソケットごとにコード内から TCP タイムアウトを構成することは困難です (不可能ではありません)。

于 2015-11-25T23:19:19.227 に答える
0

読み取りタイムアウトをsetSoTimeout(),妥当な値に設定し、予想される応答時間を 2 倍にして、結果をキャッチします。SocketTimeoutException.

「Java TCP キープアライブ」のようなものはありません。

于 2013-11-05T22:00:12.837 に答える