software net failed caused java sockets

caused - java.net.SocketException: El software provocó la interrupción de la conexión: recv failed



nested exception is java net socketexception software caused connection abort recv failed (10)

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

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

Notas:

  • Este error es infrecuente e impredecible; aunque obtener este error significa que todas las solicitudes futuras de URI también fallarán.
  • La única solución que funciona (también, solo ocasionalmente) es reiniciar Tomcat y / o la máquina real (Windows en este caso).
  • El URI está definitivamente disponible (como se confirma pidiéndole al navegador que haga 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();


¿Estás accediendo a datos http? ¿Puedes 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/


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 "Restablecimiento de conexión por pares" mucho más común. Puede ocurrir esporádicamente cuando se conecta a través de Internet, pero también sistemáticamente si el momento es el correcto (por ejemplo, con las conexiones de mantener vivo en el host local).

Un cliente HTTP debería simplemente volver a abrir la conexión y volver a intentar la solicitud. Es importante comprender que cuando una conexión se encuentra en este estado, no hay otra salida que 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, agrupamiento 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 ...


Esto generalmente significa que hubo un error de red, como un tiempo de espera 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 verificar los registros de su enrutador, si corresponde. Si la conexión inalámbrica está involucrada en cualquier lugar, esa es otra fuente de este tipo de errores.


Esto ocurrirá de vez en cuando, ya sea cuando una conexión expira o cuando un host remoto finaliza su conexión (aplicación cerrada, apagado de la computadora, etc.). Puede evitar esto administrando los sockets usted mismo y manejando las desconexiones en su aplicación a través de su protocolo de comunicaciones y luego llamando a shutdownInput y shutdownOutput para borrar la sesión.


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


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


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


Mire si tiene otro servicio o programa ejecutándose en el puerto http. Me pasó cuando traté de usar el puerto y fue tomado por otro programa.


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


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

sc.setSoLinger(true, 10);

COPIA DE UN SITIO WEB -> Al usar el método setSoLinger() , puede establecer explícitamente un retraso antes de que se envíe un restablecimiento, dando más tiempo para leer o enviar datos.

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