У меня проблемы с Java Sockets. У меня есть пара приложений, которые устанавливают соединение между ними (один открывает ServerSocket
, вызывает accept()
и ждет, а другой подключается через конструктор Socket(InetAddress,int)
.
После того, как соединение установлено, сокет Thread
создается с этим Runnable
.
public void run() {
System.out.print("Watching Socket for closing ");
while(running) {
if(socket.isClosed()) {
System.out.println("Socket has been closed");
break;
}
}
this.running = false;
//safely ends this application by closing i/o and exiting.
}
Моя проблема заключается в том, что когда одно из приложений неожиданно закрывается (в моем случае завершено с Eclipse), вызов Socket.isClosed()
прежнему показывает, что сокет открыт, и поэтому цикл продолжает работать, как если бы Socket был открыт.
Как я могу обнаружить, когда Socket закрывается, когда приложение Java с другой стороны принудительно завершено?
Единственный способ, которым socket.isClosed()
возвращает true, - это если вы называете себя socket.close()
поскольку это единственная часть, где логическое значение будет установлено в true
.
Что вы можете сделать, просто попробуйте прочитать из socket
используя inputStream
и -1 будет возвращен, если он будет закрыт (если конец потока достигнут).
Дополнительную информацию см. В документации.
InputStream
при закрытом соединении мгновенно возвращать -1, но когда соединение есть, но данных еще нет, оно блокируется, пока оно не будет? Также будет выброшено IOException
? У меня не было возможности прочитать JavaDoc, поэтому я прошу прощения, если это все там.