Различают отказ в соединении и тайм-аут соединения - PullRequest
7 голосов
/ 29 июля 2010

При использовании java.net.Socket.connect() как отказанное соединение, так и тайм-аут приводят к ConnectException.

java.net.ConnectException: Connection timed out: connect

java.net.ConnectException: Connection refused: connect

Как можно безопасно различать эти два?Конечно, разбор сообщения об ошибке делает работу.Но когда сообщение изменится в будущем выпуске Java, мне не повезет.

Общая картина: я пишу клиент веб-службы, использующий JAX-WS с реализацией Metro.Когда происходит сбой вызова веб-службы, я хочу четко сообщить причину сбоя, чтобы проблема могла быть быстро решена.

Ответы [ 3 ]

3 голосов
/ 29 июля 2010

Измерьте время, прошедшее между вызовом connect () и сгенерированным исключением, и передайте эту информацию.

2 голосов
/ 29 июля 2010

К сожалению, в Sun JDK эта информация не доступна нигде, кроме строки.См. Строку 473 PlainSocketImpl.c (для * ix) и net_util_md.c (для Windows).Реализация * ix иногда вызывает NET_ThrowByNameWithLastError (из * ix net_util_md.c ), который будет включать errno в строку;эта функция существует в Windows, но здесь она не используется ..

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

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

0 голосов
/ 29 июля 2010

Проверьте сообщение об ошибке (как вы упомянули), но абстрагируйте его.

Если он изменится в будущем выпуске Java, вы измените его в абстракции и оставите ядро ​​своего кода в покое.

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