java.net.SocketException: el software provocó el aborto de la conexión: recv falló [duplicado]

StackOverflow https://stackoverflow.com/questions/135919

  •  02-07-2019
  •  | 
  •  

Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

No he podido encontrar una respuesta adecuada a lo que significa exactamente el siguiente error:

java.net.SocketException: el software provocó el aborto de la conexión: recv falló

Notas:

  • Este error es poco frecuente e impredecible; aunque este error significa que todas las solicitudes futuras de URI también fallarán.
  • La única solución que funciona (también, ocasionalmente) es reiniciar Tomcat y / o la máquina real (Windows en este caso).
  • El URI está definitivamente disponible (como se confirma al pedirle al navegador que realice la búsqueda).

Código relevante:

BufferedReader reader;
try { 
 URL url = new URL(URI);
 reader = new BufferedReader(new InputStreamReader(url.openStream())));
} catch( MalformedURLException e ) { 
 throw new IOException("Expecting a well-formed URL: " + e); 
}//end try: Have a stream

String buffer;
StringBuilder result = new StringBuilder();
while( null != (buffer = reader.readLine()) ) { 
 result.append(buffer); 
}//end while: Got the contents.
reader.close();
¿Fue útil?

Solución

Esto generalmente significa que hubo un error de red, como un tiempo de espera de TCP. Comenzaría colocando un sniffer (wireshark) en la conexión para ver si puede ver algún problema. Si hay un error de TCP, debería poder verlo. Además, puede consultar los registros de su enrutador, si es aplicable. Si la conexión inalámbrica está involucrada en cualquier lugar, esa es otra fuente de este tipo de errores.

Otros consejos

Esto también sucede si su cliente TLS no puede ser autenticado por el servidor configurado para requerir la autenticación del cliente.

Este error se produce cuando una conexión se cierra abruptamente (cuando se restablece una conexión TCP mientras todavía hay datos en el búfer de envío). La condición es muy similar a un 'Reinicio de conexión por par' mucho más común. Puede suceder esporádicamente cuando se conecta a través de Internet, pero también de manera sistemática si el momento es el correcto (por ejemplo, con conexiones keep-alive en localhost).

Un cliente HTTP debería volver a abrir la conexión y volver a intentar la solicitud. Es importante entender que cuando una conexión está en este estado, no hay otra manera de cerrarla. Cualquier intento de enviar o recibir producirá el mismo error.

No use URL.open () , use Apache-Commons HttpClient que tiene un mecanismo de reintento, agrupación de conexiones, keep-alive y muchas otras características.

Uso de muestra:

HttpClient httpClient = HttpClients.custom()
            .setConnectionTimeToLive(20, TimeUnit.SECONDS)
            .setMaxConnTotal(400).setMaxConnPerRoute(400)
            .setDefaultRequestConfig(RequestConfig.custom()
                    .setSocketTimeout(30000).setConnectTimeout(5000).build())
            .setRetryHandler(new DefaultHttpRequestRetryHandler(5, true))
            .build();
// the httpClient should be re-used because it is pooled and thread-safe.

HttpGet request = new HttpGet(uri);
HttpResponse response = httpClient.execute(request);
reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
// handle response ...

¿Está accediendo a los datos de http? ¿Se puede usar la biblioteca HttpClient en lugar de la biblioteca estándar? La biblioteca tiene más opciones y proporcionará mejores mensajes de error.

http://hc.apache.org/httpclient-3.x/

La única vez que he visto que sucediera algo así es cuando tengo una mala conexión o cuando alguien está cerrando el socket que estoy usando desde un contexto de subproceso diferente.

Intente agregar 'autoReconnect = true' a la cadena de conexión jdbc

Esto sucederá de vez en cuando cuando la conexión se agote o cuando un host remoto finalice su conexión (aplicación cerrada, apagado de la computadora, etc.). Puede evitar esto administrando sockets y manejando las desconexiones en su aplicación a través de su protocolo de comunicaciones y luego llamando a shutdownInput y shutdownOutput para aclarar la sesión.

Observe si tiene otro servicio o programa ejecutándose en el puerto http. Me sucedió cuando intenté usar el puerto y lo tomó otro programa.

Yo también tuve este problema. Mi solución fue:

sc.setSoLinger(true, 10);

COPIAR EN UN SITIO WEB - > Al usar el método setSoLinger () , puede establecer explícitamente un retraso antes de que se envíe un restablecimiento, lo que da más tiempo para que los datos se lean o envíen.

Tal vez no sea la respuesta para todos, sino para algunas personas.

Si está utilizando Netbeans para administrar Tomcat, intente desactivar el monitor HTTP en Herramientas - Servidores

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top