Обнаружение сокета закрывается после принудительного закрытия удаленного приложения

1

У меня проблемы с 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 с другой стороны принудительно завершено?

  • 0
    Получаете ли вы IOException во время чтения?
  • 0
    Нет, я еще не добавил ничего, что читает и пишет.
Теги:
sockets

1 ответ

5

Единственный способ, которым socket.isClosed() возвращает true, - это если вы называете себя socket.close() поскольку это единственная часть, где логическое значение будет установлено в true.

Что вы можете сделать, просто попробуйте прочитать из socket используя inputStream и -1 будет возвращен, если он будет закрыт (если конец потока достигнут).

Дополнительную информацию см. В документации.

  • 0
    @ LukeMoll есть какие-либо отзывы по этому поводу?
  • 0
    извини, я был далеко от своего компьютера. Будет ли чтение из InputStream при закрытом соединении мгновенно возвращать -1, но когда соединение есть, но данных еще нет, оно блокируется, пока оно не будет? Также будет выброшено IOException ? У меня не было возможности прочитать JavaDoc, поэтому я прошу прощения, если это все там.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню