Определите, что SocketException было вызвано потерей соединения - PullRequest
0 голосов
/ 24 июня 2019

Предположим, что некоторый код активно работает с сокетами: создает клиентские и серверные сокеты, записывает в SocketOutputStream, читает из SocketInputStream и так далее.Конечно, лежащие в основе методы сокетов могут выдавать SocketException и его производные.

Я различаю два типа ошибок.Ожидаемые ошибки - мы всегда должны ожидать сетевых сбоев и реагировать на них с переподключением или с помощью читаемых пользователем сообщений об ошибках.Существенным примером ожидаемой ошибки является потеря соединения TCP.Неожиданные ошибки - то, что определенно указывает на ошибку в нашем программном обеспечении, такие трассировки стека должны быть тщательно зарегистрированы или даже должны завершить работу всего приложения.

Я не нашел надежного способа отличить SocketException, вызванное потерей соединения, от любого другогоошибки сокета.В SocketException нет кода ошибки и нет подклассов.Все методы из пакета java.net выдают только SocketException с различными сообщениями об ошибках:

  • Socket closed - в большинстве случаев выбрасывается.
  • socket closed - может быть выброшено из Реализация Windows SocketInputStream.socketRead0.
  • Software caused connection abort: .* - может быть сгенерирована многими встроенными методами в Windows.
  • Broken pipe (Read|Write failed) - может быть сгенерирована с SocketInputStream.socketRead0 или SocketOutputStream.socketWrite0 из реализаций сокетов Unix.
  • socket write error - в SocketOutputStream.socketWrite0 для Windows .
  • Возможно, есть другие соответствующие сообщения об ошибкахчто я еще не нашел.

Есть ли способ определить, что конкретный SocketException был вызван потерянным TCP-соединением, или единственный способ - проанализировать сообщения об ошибках?Если так, может, существует библиотека, которая выполняет эту проверку?Или, может быть, я делаю что-то не так и должен всегда / никогда не игнорировать какие-либо особенности SocketExceptions их природы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...