¿Por qué se produciría una excepción "java.net.ConnectException: conexión agotada" cuando la URL está activa?
connection urlconnection (9)
Recibo una ConnectException: Connection timed out
con cierta frecuencia desde 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.
Aquí está el rastro 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);
}
El mensaje de error lo dice todo: su conexión ha expirado. 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 probablemente sean una de:
a) El IP / dominio o puerto es incorrecto
b) La IP / dominio o puerto (es decir, el servicio) está inactivo
c) El dominio IP / está tardando más que su tiempo de espera predeterminado para responder
d) Usted tiene un firewall que está bloqueando solicitudes o respuestas en cualquier puerto que esté utilizando
e) Usted tiene un firewall que bloquea las solicitudes a ese host en particular
f) Su acceso a internet está caído
g) Su servidor en vivo está inactivo, es decir, en el caso de "llamada API de reposo".
Tenga en cuenta que su ISP puede implementar firewalls y bloqueo de puerto o de IP.
Esto puede ser un problema de IPv6 (el host publica una dirección AAAA IPv6 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 se puede hacer mucho más que establecer un tiempo de espera y agregar buenos mensajes de error (especialmente imprimir 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.
Existe la posibilidad de que su IP / host sea bloqueado por el host remoto, especialmente si cree que está golpeándolo demasiado.
La razón por la que esto me sucedió fue que un servidor remoto solo permitía el acceso a cierto IP pero no el suyo, y yo estaba intentando renderizar las imágenes desde las URL del servidor ... para que todo se detuviera, mostrando el error de tiempo de espera que usted tenido...
Asegúrese de que el servidor permita su propia IP o que esté procesando elementos desde alguna URL remota que realmente exista.
Los tiempos de espera de conexión (suponiendo que una red local y varias máquinas cliente) suelen ser el resultado de
a) algún tipo de firewall en el camino que simplemente come los paquetes sin decirle al remitente cosas como "No Route to host"
b) pérdida de paquetes debido a una configuración de red incorrecta o sobrecarga de línea
c) demasiadas solicitudes sobrecargando el servidor
d) un pequeño número de hilos / procesos disponibles simultáneamente en el servidor, lo que lleva a que se tomen todos. Esto sucede especialmente con solicitudes que tardan mucho tiempo en ejecutarse y pueden combinarse con c).
Espero que esto ayude.
Recomiendo aumentar el tiempo de espera de conexión antes de obtener el flujo de salida, así:
urlConnection.setConnectTimeout(1000);
Donde 1000 está en milisegundos (1000 milisegundos = 1 segundo).
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.
Solucioné mi problema con:
System.setProperty("https.proxyHost", "myProxy");
System.setProperty("https.proxyPort", "80");
o http.proxyHost
...
- intenta hacer Telnet para ver cualquier problema de firewall
- realizar
tracert
/traceroute
para encontrar el número de saltos