1. ホーム
  2. java

[解決済み] リモート側のソケットクローズを検出する方法は?重複

2023-05-10 21:42:08

質問

をどのように検出するのですか? Socket#close() がリモート側のソケットで呼び出されたことをどのように検出しますか?

どのように解決するのですか?

この isConnected メソッドは役に立ちません。 true を返してしまいます。これを試してみてください。

public class MyServer {
    public static final int PORT = 12345;
    public static void main(String[] args) throws IOException, InterruptedException {
        ServerSocket ss = ServerSocketFactory.getDefault().createServerSocket(PORT);
        Socket s = ss.accept();
        Thread.sleep(5000);
        ss.close();
        s.close();
    }
}

public class MyClient {
    public static void main(String[] args) throws IOException, InterruptedException {
        Socket s = SocketFactory.getDefault().createSocket("localhost", MyServer.PORT);
        System.out.println(" connected: " + s.isConnected());
        Thread.sleep(10000);
        System.out.println(" connected: " + s.isConnected());
    }
}

サーバを起動し、クライアントを起動します。2回目にソケットが閉じられているにもかかわらず、"connected: true"と2回表示されているのがわかると思います。

実際に確認する唯一の方法は、読み込み (戻り値として -1 が得られます) または書き込み (ソケットを閉じるための IOException (壊れたパイプ)が投げられる)関連するInput/OutputStreamsを読むことです。