Java.Net.ConnectException: conexión agotada

Shuvayan Ghosh Dastidar 12 octubre 2023
  1. Hacer llamadas de red con java.net en Java
  2. Error en el Paquete java.net en Java
Java.Net.ConnectException: conexión agotada

El paquete java.net tiene muchas funciones que se pueden usar para hacer conexiones con cualquier servidor en Internet y, por lo tanto, se pueden usar para hacer llamadas de descanso como GET o POST.

Este tutorial se centrará en el uso de este paquete para realizar llamadas de red básicas y qué errores se pueden enfrentar y resolver.

Hacer llamadas de red con java.net en Java

Hacer llamadas de red es una de las cosas más importantes a las que se enfrentan a diario los desarrolladores de Java. Hacer llamadas de red correctamente puede hacer que la aplicación sea más robusta y brindar una buena experiencia de usuario.

El paquete java.net tiene muchas funciones asociadas con la realización de llamadas de red.

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

class Main {
  public static void main(String args[]) throws Exception {
    HttpURLConnection.setFollowRedirects(true); // Defaults to true

    String url = "https://www.delftstack.com/howto/java/";
    URL request_url = new URL(url);
    HttpURLConnection http_conn = (HttpURLConnection) request_url.openConnection();
    http_conn.setConnectTimeout(100000);
    http_conn.setReadTimeout(100000);
    http_conn.setInstanceFollowRedirects(true);
    System.out.println(String.valueOf(http_conn.getResponseCode()));
  }
}

El segmento de código anterior realiza una solicitud GET a la variable url y luego abre una conexión. Si todo funciona, imprime el código de respuesta de 200.

Sin embargo, después de demasiados intentos, falla al conectarse al servidor y puede generar una IOException.

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

class Main {
  public static void main(String args[]) throws Exception {
    URL url = new URL("https://reqres.in/api/users");
    HttpURLConnection http = (HttpURLConnection) url.openConnection();
    http.setRequestMethod("POST");
    http.setDoOutput(true);
    http.setRequestProperty("Content-Type", "application/json");
    http.setRequestProperty("Content-Length", "0");
    String body = "{\"name\": \"morpheus\",\"job\": \"leader\"}";
    http.getOutputStream().write(body.getBytes("UTF8"));
    System.out.println(http.getResponseCode() + " " + http.getResponseMessage());
    http.disconnect();
  }
}

El segmento de código anterior realiza una solicitud POST a un servidor API REST de muestra y devuelve la respuesta.

Error en el Paquete java.net en Java

Puede haber un problema de Tiempo de espera de conexión agotado al realizar llamadas de red en Java. Solucionar esos problemas a veces es similar a por qué una determinada URL no se abre en un navegador.

Pueden deberse a:

  1. La IP/dominio de la URL es incorrecta.
  2. El servidor correspondiente a la IP/dominio está caído.
  3. Es posible que un firewall haya bloqueado las solicitudes o que Internet esté detrás de un proxy.
  4. El servidor puede tener una lista de bloqueo de la IP.

Por ejemplo:

import java.io.*;
import java.net.URL;
import java.net.URLConnection;

class Main {
  public static void main(String args[]) throws Exception {
    URLConnection urlConnection = null;
    OutputStream outputStream = null;
    URL url = new URL("http://google.com");
    urlConnection = url.openConnection();
    urlConnection.setConnectTimeout(1);
  }
}

Producción :

Exception in thread "main" java.net.SocketTimeoutException: Connect timed out
	at java.base/java.net.Socket.connect(Socket.java:648)
	at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:177)
	at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:474)
	at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:569)
	at java.base/sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
...

Por lo tanto, la excepción anterior se produce cuando no se puede abrir una conexión adecuada al socket o la URL, y la combinación de puertos o el tiempo de espera son insuficientes para conectarse a la URL, que en este caso está restringida por urlConnection.setConnectTimeout(1);.

Se puede intentar lo siguiente para evitar el error Tiempo de espera de conexión agotado en Java.

  1. Configuración de la duración del contenido a través de setFixedLengthStreamingMode().
  2. Hacer reintentos a la conexión en caso de que falle la conexión URL en el primer intento.
  3. Aumentar el límite de conexión a una cantidad mayor mediante la función setConnectTimeout.
Shuvayan Ghosh Dastidar avatar Shuvayan Ghosh Dastidar avatar

Shuvayan is a professional software developer with an avid interest in all kinds of technology and programming languages. He loves all kinds of problem solving and writing about his experiences.

LinkedIn Website

Artículo relacionado - Java Exception