Как правильно закрыть сокет после того, как исключение поймано?

После моего последнего проекта у меня была проблема, что клиент ожидал объект от сервера, но в то время как обработка клиентов ввела исключение, которое вынуждает сервер закрыться, сокет из соображений безопасности пойман.

Это заставляет клиент завершаться очень неприятным способом, способ, которым я решил иметь дело с этим, отправлял клиенту Входное сообщение о состоянии после каждого полученного входа так, чтобы он знал, был ли его вход обработан правильно или если он должен выдать исключение.

Так мой вопрос:

  • Существует ли лучший/более чистый способ закрыть сокет после того, как исключение будет поймано?
5
задан palacsint 15 November 2012 в 15:22
поделиться

4 ответа

Если я правильно понимаю, вы уже закрыли сокет со стороны сервера, и вы нужно, чтобы ваш клиент осознал это и соответствующим образом обработал ошибку.

См. Документацию Socket и, в частности, метод setSoTimeout . Например, если тайм-аут установлен на 5 секунд, и клиент пытается читать из сокета сервера, но не получает ответа, то тайм-аут истекает и возникает исключение java.net.SocketTimeoutException , и вы может поймать его и закрыть розетку.

Вы также можете использовать ScheduledExecutorService или Таймер для имитации тайм-аута.

2
ответ дан 14 December 2019 в 19:12
поделиться

Вы действительно не можете, так как сокет закрыт, вы можете прослушивать на клиенте

java.net.SocketException: socket closed 

и тогда вы узнаете, что потеряли соединение с сервер.

0
ответ дан 14 December 2019 в 19:12
поделиться

Для таких вещей:

  1. Не забудьте поместить этот код сокета в блок try / catch.
  2. Закройте сокет в "finally". Таким образом вы гарантированно закрываете сокет вне зависимости от того, есть ли исключение.
2
ответ дан 14 December 2019 в 19:12
поделиться

Неверно. Это исключение возникает только тогда, когда вы пытаетесь использовать сокет , который вы закрыли сами .

OP должен искать EOFException, IOException: «сброс соединения» или SocketTimeoutException.

1
ответ дан 14 December 2019 в 19:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: