Это довольно распространенная проблема (необходимо знать, когда канал разорван), и один из ответов был правильным в подходе, утверждающем, что Клиент должен будет «проверять» сокет (периодически)чтобы увидеть, если он закрыт. Сервер не будет уведомлять Клиент , что сокет закрыт и, действительно, не может, потому что он, ну, в общем, закрыт.Межсетевые экраны, прокси-серверы и т.п. между Client и Server могли прервать или иным образом заблокировать обмен сокетами в одном или обоих направлениях в любой точке после установления соединения.
Во-первых, если вы много занимались программированием сокетов (на «C» или Java и т. Д.) ... вы увидите ошибку / исключение типа «попытка записи по сломанному каналу».Это класс ошибок ввода / вывода, когда Клиент пытается записать (отправить) данные в закрытый сокет (который был обнаружен закрытым).
Таким образом, ответ заключается в управлении сокетом над слоем создания сокета.
То есть поток на клиенте должен будет отслеживать сокет, посылая данные (периодически на сервер, что-то вроде «ping» для проверки состояния разорванного канала)), а затем уничтожить (очистить) и заново создать сокет (промыть и повторить), если произойдет ошибка ввода-вывода.
Обратите внимание, что более сложный двунаправленный бит логики будет лучше, если Клиент может обеспечить ожидаемый и непротиворечивый (и своевременный) ответ от Сервера на заданный «пинг».Это конкретно подтвердило бы, что двунаправленный трафик течет.В противном случае межсетевые экраны могут закрывать трафик в одном направлении, в то время как Клиент полагает, что он все еще «общается» с Сервером (который вполне может получать данные, но не может передавать их обратно Клиенту - возможно, вызывая его прекращение.соединение по таймауту неактивности).