java.net.SocketException: el software provocó la cancelación de la conexión: error de recepción en Java

Sheeraz Gul 12 octubre 2023
java.net.SocketException: el software provocó la cancelación de la conexión: error de recepción en Java

Este tutorial demuestra cómo resolver el siguiente error en Java:

java.net.SocketException: Software caused connection abort: recv failed

Resuelva la excepción java.net.SocketException: el software provocó la interrupción de la conexión: error de recepción en Java

La SocketException es una subclase de IOException, que ocurre cuando intentamos acceder a un socket. El Software Caused Connection Abort: Recv Failed aparece cuando se produce un error de red, como un tiempo de espera o el servidor no puede autenticar al cliente TLS.

La mayoría de las veces, este error ocurre cuando se usan plataformas como Tomcat. Este error ocurre cuando la conexión TCP se restablece mientras los datos aún están en el búfer, lo que detiene la conexión abruptamente.

Este error es similar a la excepción Restablecimiento de conexión por pares. Aquí hay un ejemplo que puede arrojar las excepciones java.net.SocketException: el software provocó el aborto de la conexión: la recepción falló.

BufferedReader Buffered_Reader;
String URI = "https://www.delftstack.com/";
try {
  URL DEMOURL = new URL(URI);
  Buffered_Reader = new BufferedReader(new InputStreamReader(DEMOURL.openStream()));
} catch (MalformedURLException e) {
  throw new IOException("Enter the correct URL: " + e);
}

String DemoBuffer;
StringBuilder Result_StringBuilder = new StringBuilder();
while (null != (DemoBuffer = Buffered_Reader.readLine())) {
  Result_StringBuilder.append(DemoBuffer);
}
Buffered_Reader.close();

El código anterior intenta acceder al cliente HTTP, pero la conexión se cierra abruptamente. El error ocurrirá en la línea:

Buffered_Reader = new BufferedReader(new InputStreamReader(DEMOURL.openStream()));

Esto se debe a que DEMOURL.openStream() no funcionará correctamente para un cliente HTTP. El uso de Apache Commons HttpClient resolverá este problema.

El HttpClient volverá a abrir la conexión y volverá a intentar la solicitud. El uso de la biblioteca HttpClient nos dará una mejor comprensión de los mensajes de error. El HttpClient tiene agrupación de conexiones, mecanismo de reintento, mantenimiento de conexión y muchas otras características.

Aquí hay una muestra utilizada para este escenario:

String URI = "https://www.delftstack.com/";
HttpClient Demo_Http_Client =
    HttpClients.custom()
        .setConnectionTimeToLive(10, TimeUnit.SECONDS)
        .setMaxConnTotal(200)
        .setMaxConnPerRoute(200)
        .setDefaultRequestConfig(
            RequestConfig.custom().setSocketTimeout(15000).setConnectTimeout(2500).build())
        .setRetryHandler(new DefaultHttpRequestRetryHandler(3, true))
        .build();
// the httpClient can be re-used as it is thread-safe and pooled.

HttpGet Http_Get_request = new HttpGet(URI);
HttpResponse Http_Response = Demo_Http_Client.execute(Http_Get_request);
Buffered_Reader = new BufferedReader(new InputStreamReader(Http_Response.getEntity().getContent()));
// handle the response.

El código anterior manejará la operación cliente-servidor correctamente, y si ocurre algún error de red, el HttpClient volverá a intentar el proceso.

Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

Artículo relacionado - Java Error