Как обнаружить ближайший боковой разъем?

Как вы обнаруживаете, был ли вызов Socket#close() в сокете на стороне?

Ответ 1

Метод 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());
    }
}

Запустите сервер, запустите клиент. Вы увидите, что он дважды печатает "connected: true", даже если сокет закрыт второй раз.

Единственный способ узнать это - прочитать (вы получите -1 в качестве возвращаемого значения) или написать (связанный с текстом IOException (сломанный канал)) на связанных входах/выходах.

Ответ 2

Поскольку ответы отклоняются, я решил проверить это и опубликовать результат - включая тестовый пример.

Сервер здесь просто записывает данные клиенту и не ожидает ввода.

Сервер:

ServerSocket serverSocket = new ServerSocket(4444);
Socket clientSocket = serverSocket.accept();
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
while (true) {
  out.println("output");
  if (out.checkError()) System.out.println("ERROR writing data to socket !!!");
  System.out.println(clientSocket.isConnected());
  System.out.println(clientSocket.getInputStream().read());
        // thread sleep ...
  // break condition , close sockets and the like ...
}
  • clientSocket.isConnected() возвращает всегда true, как только клиент подключается (и даже после отключения) странно!!
  • getInputStream(). Чтения()
    • заставляет поток ждать ввода до тех пор, пока клиент подключен, и поэтому ваша программа ничего не делает - за исключением случаев, когда вы получаете какой-либо ввод
    • возвращает -1, если клиент отключен
  • out.checkError() является истинным, как только клиент отключается, поэтому я рекомендую это

Ответ 3

Вы также можете проверить ошибку выходного потока сокета при записи в клиентский сокет.

out.println(output);
if(out.checkError())
{
    throw new Exception("Error transmitting data.");
}

Ответ 4

Метод Socket.Available немедленно вызовет исключение SocketException, если удаленная система отключила/закрыла соединение.