При условии, что все остальное работает, если удаленный узел - сервер TCP - был убит, тогда клиент TCP обычно получит TCP RST (сброс), и вы получите IOException
в своем клиентском приложении.
Тем не менее, есть много других вещей, которые могут пойти не так, как процесс, который будет убитВ основном все, что находится на сетевом пути между двумя процессами: кабель дергается, маршрутизатор умирает, брандмауэр умирает и т. Д. Все это не будет немедленно обнаружено.
Для вышеупомянутогоПричины, по которым общее правило - как указано в ответе EJP - что разорванное соединение может быть обнаружено только путем записи в него .Вот почему всегда рекомендуется, чтобы TCP-клиент и TCP-сервер обменивались сообщениями определенного типа с регулярными интервалами.Есть разные способы сделать это.Мне больше всего нравится метод, в котором TCP-клиент будет - при отсутствии данных, получаемых с TCP-сервера - отправлять сообщение пульса на сервер и ожидать ответа в течение определенного периода времени.Таким образом, сообщения сердцебиения будут отправляться только тогда, когда это действительно необходимо.
Неоптимальный подход - если вы не можете реализовать истинное сердцебиение - это всегда читать с таймаутом.Установите тайм-аут на сокете , а затем перехватите java.net.SocketTimeoutException
.Это позволит вам знать, что в течение x миллисекунд не было получено никаких данных на сокете.
Следует отметить, что есть один сценарий, в котором вам не нужно использовать биение сердца или тайм-аут сокета: еслиTCP-клиент и TCP-сервер обмениваются данными по интерфейсу обратной связи, после чего разорванное соединение всегда будет передаваться как клиентскому приложению TCP, так и приложению сервера TCP.Это связано с тем, что в данном случае между двумя процессами нет сетевой инфраструктуры.Таким образом, если у вас есть существующее приложение, которое не разработано с точки зрения связи по протоколу TCP (т.е. оно не реализует какую-либо форму сердцебиения или, по крайней мере, чтения с тайм-аутом), то в качестве последнего средства вы можете «исправить»проблема заключается в перемещении двух приложений на один и тот же хост и разрешении их связи через интерфейс обратной связи.