У меня есть клиентская программа, которая отправляет сообщения, набранные на консоль, на сервер. Следуя некоторым советам, я ввел чек для закрытого гнезда с Socket.checkError()
. Тем не менее, по какой-то причине он указывает на ошибку только после второй неудачной попытки отправить сообщение.Сообщение Java отправлено в закрытое гнездо
Мой код:
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
while (true)
try (
Socket clientSocket = new Socket(hostname, port);
PrintWriter socketOut = new PrintWriter(clientSocket.getOutputStream(), true);
) {
String input;
while ((input=stdIn.readLine())!=null) {
socketOut.println(input);
if (socketOut.checkError()) {
System.out.println("Got socket error");
break;
}
}
} catch (IOException e) {
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {}
}
я закрыл (вручную) на моей стороне сервера после получения 'Сообщение1'. Поэтому я ожидаю получить ошибку при попытке отправить следующее сообщение. Тем не менее, это происходит только одно сообщение после:
message1
message2
message3
Got socket error
Может кто-нибудь объяснить это поведение и посоветовать мне способ, чтобы получить уведомление прямо на первой попытке отправить сообщение в недействительным?
Полностью смущен, и по крайней мере частично неправильно. 'Socket.isClosed()' и 'Socket.isConnected()' будут * never * возвращать false в соответствии с тем, что одноранговый узел сделал с * соединением *, или сетевой ошибкой. Они говорят вам точно и только то, что * вы * сделали с этим сокетом *: связали его, закрыли. – EJP
Да и не рассказывайте, что сделал сверстник. Если другая сторона закрыла сокет, вы не можете проверить его с помощью isClosed() –
Вот что я сказал, и вот что делает все в вашем ответе после «Примечание: также если isConnected будет работать как вам нравится». Вы должны удалить его. – EJP