2008-09-17 57 views
66

Recibo un ConnectException: Connection timed out con cierta frecuencia de mi código. La URL que trato de alcanzar está activa. El mismo código funciona para algunos usuarios, pero no para otros. Parece que una vez que un usuario comienza a recibir esta excepción, continúa obteniendo la excepción.¿Por qué una excepción "java.net.ConnectException: conexión agotó el tiempo de espera" se produce cuando la URL está activa?

Aquí es el seguimiento de la pila:

java.net.ConnectException: Connection timed out 
Caused by: java.net.ConnectException: Connection timed out 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) 
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) 
    at java.net.Socket.connect(Socket.java:516) 
    at java.net.Socket.connect(Socket.java:466) 
    at sun.net.NetworkClient.doConnect(NetworkClient.java:157) 
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:365) 
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:477) 
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:214) 
    at sun.net.www.http.HttpClient.New(HttpClient.java:287) 
    at sun.net.www.http.HttpClient.New(HttpClient.java:299) 
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:796) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:748) 
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:673) 
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:840) 

Aquí hay un fragmento de mi código:

URLConnection urlConnection = null; 
OutputStream outputStream = null; 
OutputStreamWriter outputStreamWriter = null; 
InputStream inputStream = null; 

try { 
    URL url = new URL(urlBase); 
    urlConnection = url.openConnection(); 
    urlConnection.setDoOutput(true); 

    outputStream = urlConnection.getOutputStream(); // exception occurs on this line 
    outputStreamWriter = new OutputStreamWriter(outputStream); 
    outputStreamWriter.write(urlString); 
    outputStreamWriter.flush(); 
    inputStream = urlConnection.getInputStream(); 
    String response = IOUtils.toString(inputStream); 
    return processResponse(urlString, urlBase, response); 
} catch (IOException e) { 
    throw new Exception("Error querying url: " + urlString, e); 
} finally { 
    IoUtil.close(inputStream); 
    IoUtil.close(outputStreamWriter); 
    IoUtil.close(outputStream); 
} 
+7

Por favor marque una respuesta como accpeted si ha resuelto su problema :) – Tobias

Respuesta

0

Hay una posibilidad de que su IP/host están bloqueados por el host remoto, especialmente si cree que lo estás golpeando demasiado.

67

tiempos de espera de conexión (suponiendo una red local y varias máquinas cliente) por lo general son el resultado de

a) algún tipo de cortafuegos en la forma en que simplemente se come los paquetes sin decirle las cosas remitente como "No route to host"

b) la pérdida de paquetes debido a la configuración de la red equivocada o la sobrecarga de línea

c) demasiadas peticiones sobrecarga del servidor

d) un pequeño número de hilos simultáneamente disponibles/procesa o n el servidor que los lleva a todos. Esto sucede especialmente con solicitudes que tardan mucho tiempo en ejecutarse y pueden combinarse con c).

Espero que esto ayude.

+4

(d) es solo un caso especial de (c). – EJP

29

Si la URL funciona bien en el navegador web en la misma máquina, es posible que el código Java no esté utilizando el proxy HTTP que el navegador está utilizando para conectarse a la URL.

6

Me gustaría recomendar elevar el tiempo de espera de conexión antes de recibir el flujo de salida, así:

urlConnection.setConnectTimeout(1000); 

Donde 1000 es en milisegundos (1000 milisegundos = 1 segundo).

+12

Eso no lo está elevando, eso es bajarlo, drásticamente. Por defecto, se trata de un minuto, y * no * puede aumentarlo, solo puede bajarlo. – EJP

3
  • tratar de hacer lo Telnet para ver cualquier problema de cortafuegos
  • realizar tracert/traceroute Para encontrar el número de saltos
1

Esto puede ser un problema IPv6 (el anfitrión publica un IPv6 AAAA Dirección y el host de los usuarios piensa que está configurado para IPv6 pero en realidad no está conectado correctamente). Esto también puede ser un problema de MTU de red, un bloque de cortafuegos o el host de destino puede publicar diferentes direcciones IP (al azar o basadas en el país de originadores) que no son accesibles. O problemas de red similares.

No puede hacer mucho además de establecer un tiempo de espera y agregar buenos mensajes de error (especialmente la impresión de la dirección resuelta de los hosts). Si desea hacerlo más robusto, vuelva a intentarlo, intente en paralelo todas las direcciones y también investigue el almacenamiento en memoria caché de resolución de nombres (positivo y negativo) en la plataforma Java.

0

La razón por la que esto me sucedió fue porque un servidor remoto permitía solo ciertas direcciones IP dirigidas, pero no suyas, y yo estaba intentando renderizar las imágenes desde las URL del servidor ... para que todo simplemente se detuviera, mostrando el error de tiempo de espera que tuviste ...

Asegúrese de que el servidor permita su propia IP o de que esté procesando elementos desde alguna URL remota que realmente exista.

2

El mensaje de error lo dice todo: se agotó el tiempo de espera de la conexión. Esto significa que su solicitud no recibió una respuesta dentro de un período de tiempo (predeterminado). Las razones por las que no se recibió respuesta es probable que sea uno de:

a) El IP/dominio o puerto es incorrecta

b) El IP/dominio o puerto (es decir, servicio) es hacia abajo

c) La dirección IP/dominio está demorando más de lo que su tiempo de espera predeterminado para responder

d) tiene un cortafuegos que está bloqueando las peticiones o respuestas en cualquier puerto que está utilizando

e) usted tiene un firewall que bloquea solicitudes a ese host en particular

f) El acceso a Internet está abajo

g) Su vivo-servidor está caído es decir en el caso de "llamada de API-resto".

Tenga en cuenta que los servidores de seguridad y puerto IP o bloqueo pueden estar en su lugar por su ISP

0

he resuelto mi problema:

System.setProperty("https.proxyHost", "myProxy"); 
System.setProperty("https.proxyPort", "80"); 

o http.proxyHost ...

Cuestiones relacionadas