2010-07-29 35 views
7

Al usar java.net.Socket.connect(), tanto una conexión rechazada como un tiempo de espera dan como resultado un ConnectException.Distinga entre la conexión rechazada y el tiempo de espera de la conexión expiró

java.net.ConnectException: Connection timed out: connect 

java.net.ConnectException: Connection refused: connect 

¿Cómo puedo distinguir con seguridad entre los dos? Asegúrese de analizar el mensaje de error hace el trabajo. Pero cuando el mensaje cambie en una futura versión de Java, no tengo suerte.

La imagen más grande: estoy escribiendo un cliente de servicio web utilizando JAX-WS con una implementación de Metro. Cuando falla una llamada al servicio web, quiero informar claramente el motivo del error para que el problema pueda resolverse rápidamente.

Respuesta

2

Desafortunadamente, en el JDK de Sun, esta información no está disponible en ninguna otra parte que no sea la cadena. Consulte la línea 473 de PlainSocketImpl.c (para * ix) y net_util_md.c (para Windows). La implementación * ix a veces llama a NET_ThrowByNameWithLastError (desde * ix net_util_md.c), que incluirá errno en la cadena; esta función existe en Windows, pero no se usa aquí ...

Por lo tanto, debe confiar en las cadenas y esperar que no cambien. Sun no parece localizarlos, lo que tiene sentido porque se supone que no deben estar orientados al usuario. Puede intentar analizar el error de errno para obtener un código de error más estable.

También debe asegurarse de tener una recuperación en caso de que no coincidan cadenas o errno.

+0

Tener una alternativa es una solución aceptable. –

+0

Me gusta esta respuesta, pero mantengo mi sugerencia anterior: ¡abstraerla! Lo último que desea es un montón de comprobaciones inconsistentes y repetitivas en una interfaz en la que no puede confiar. Cree una interfaz que tenga sentido para usted y abstraiga los detalles. No desea editar una docena de archivos si algo cambia. – riwalk

0

Compruebe el mensaje de error (como usted mencionó), pero resúmalo.

Si cambia en una futura versión de Java, la cambia en la abstracción y deja solo el núcleo de su código.

+1

Esto se interrumpirá inmediatamente si la JVM tiene mensajes localizados. –

3

Mida el tiempo transcurrido entre la invocación de connect() y se lanzó la excepción, y pase esa información.

Cuestiones relacionadas