Как определить, что удаленная боковая розетка закрыта?[дубликат]

StackOverflow https://stackoverflow.com/questions/151590

  •  02-07-2019
  •  | 
  •  

Вопрос

На этот вопрос уже есть ответ здесь:

Как вы определяете, если 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());
    }
}

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

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

Другие советы

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

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

Сервер:

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().read()
    • заставляет поток ожидать ввода до тех пор, пока клиент подключен, и, следовательно, заставляет вашу программу ничего не делать - за исключением случаев, когда вы получаете некоторый ввод
    • возвращает значение -1, если клиент отключен
  • out.checkError() становится истинным, как только клиент отключается, поэтому я рекомендую следующее

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top