После моего последнего проекта у меня была проблема, что клиент ожидал объект от сервера, но в то время как обработка клиентов ввела исключение, которое вынуждает сервер закрыться, сокет из соображений безопасности пойман.
Это заставляет клиент завершаться очень неприятным способом, способ, которым я решил иметь дело с этим, отправлял клиенту Входное сообщение о состоянии после каждого полученного входа так, чтобы он знал, был ли его вход обработан правильно или если он должен выдать исключение.
Так мой вопрос:
Если я правильно понимаю, вы уже закрыли сокет со стороны сервера, и вы нужно, чтобы ваш клиент осознал это и соответствующим образом обработал ошибку.
См. Документацию Socket и, в частности, метод setSoTimeout
. Например, если тайм-аут установлен на 5 секунд, и клиент пытается читать из сокета сервера, но не получает ответа, то тайм-аут истекает и возникает исключение java.net.SocketTimeoutException
, и вы может поймать его и закрыть розетку.
Вы также можете использовать ScheduledExecutorService
или Таймер
для имитации тайм-аута.
Вы действительно не можете, так как сокет закрыт, вы можете прослушивать на клиенте
java.net.SocketException: socket closed
и тогда вы узнаете, что потеряли соединение с сервер.
Для таких вещей:
Неверно. Это исключение возникает только тогда, когда вы пытаетесь использовать сокет , который вы закрыли сами .
OP должен искать EOFException, IOException: «сброс соединения» или SocketTimeoutException.