¿Qué está causando mi java.net.SocketException: restablecimiento de la conexión? [duplicate]

9 minutos de lectura

¿Que esta causando mi javanetSocketException restablecimiento de la conexion duplicate
ricardo

Estamos viendo frecuentes pero intermitentes java.net.SocketException: Connection reset errores en nuestros registros. No estamos seguros de dónde está el Connection reset realmente proviene el error y cómo realizar la depuración.

El problema parece no estar relacionado con los mensajes que intentamos enviar. Tenga en cuenta que el mensaje es no connection reset by peer.

¿Alguna sugerencia sobre cuáles podrían ser las causas típicas de esta excepción y cómo podríamos proceder?

Aquí hay un rastro de pila representativo (com.companyname.mtix.sms es nuestro componente):


    java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:168)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:235)
        at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:77)
        at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:105)
        at org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1115)
        at org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1832)
        at org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1590)
        at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:995)
        at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:397)
        at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324)
        at com.companyname.mtix.sms.services.impl.message.SendTextMessage.sendTextMessage(SendTextMessage.java:127)
        at com.companyname.mtix.sms.services.MessageServiceImpl.sendTextMessage(MessageServiceImpl.java:125)
        at com.companyname.mtix.sms.services.remote.MessageServiceRemoteImpl.sendTextMessage(MessageServiceRemoteImpl.java:43)
        at sun.reflect.GeneratedMethodAccessor203.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397)
        at org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider.java:186)
        at org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:323)
        at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
        at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
        at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
        at org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:453)
        at org.apache.axis.server.AxisServer.invoke(AxisServer.java:281)
        at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:699)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
        at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at com.companyname.mtix.sms.http.filters.NoCacheFilter.doFilter(NoCacheFilter.java:63)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at com.companyname.mtix.sms.http.filters.MessageFilter.doFilter(MessageFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:61)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.ajaxanywhere.AAFilter.doFilter(AAFilter.java:46)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:595)
    

Nuestro componente es una aplicación web, que se ejecuta bajo Tomcat, que llama a un servicio web de terceros que envía mensajes SMS, y así sucede. La línea de nuestro código en la que se lanza la excepción es la última línea en el fragmento de código a continuación.

String aggregatorResponse = null;
HttpClient httpClient = prepareHttpClient( username, password );
PostMethod postMethod = preparePostMethod( textUrl );

try {
  SybaseTextMessageBuilder builder = new SybaseTextMessageBuilder();
  URL notifyUrl = buildNotificationUrl( textMessage, codeSetManager );
  String smsRequestDocument = builder.buildTextMessage( textMessage, notifyUrl );
  LOG.debug( "Sybase MT document created as: \n" + smsRequestDocument );

  postMethod.setRequestEntity( new StringRequestEntity( smsRequestDocument ) );
  LOG.debug( "commiting SMS to aggregator: " + textMessage.toString() );
  int httpStatus = httpClient.executeMethod( postMethod );

  • Como puede ver en la pila completa, comienza con read operación Tu cliente se ha ido pero intentas leer de su flujo. Consulte mi solución ServerSocket stackoverflow.com/a/31741436/413032.

    – Davut Gurbüz

    31 de julio de 2015 a las 8:56

El javadoc para SocketException establece que es

Lanzado para indicar que hay un error en el protocolo subyacente, como un error de TCP

En su caso, parece que la conexión ha sido cerrada por el extremo del servidor de la conexión. Esto podría ser un problema con la solicitud que está enviando o un problema al final.

Para ayudar a la depuración, podría considerar usar una herramienta como Tiburón alambre para ver los paquetes de red reales. Además, ¿hay algún cliente alternativo a su código Java que pueda usar para probar el servicio web? Si esto tuvo éxito, podría indicar un error en el código Java.

Como está utilizando Commons HTTP Client, eche un vistazo a la Guía de registro de cliente HTTP común. Esto le indicará cómo registrar la solicitud en el nivel HTTP.

  • No creo que el restablecimiento de la conexión signifique que el servidor cerró la conexión (mediante el envío de una bandera FYN). Creo que significa que ya no responde a los indicadores ACK, o que no responde por TCP/IP). Si se envió el indicador FYN, o más bien el servidor cerró la conexión, solo obtendría -1 de read() y una EOFException. Cuando llegue a casa planeo confirmar esto de cualquier manera.

    – Zombis

    22 de abril de 2010 a las 15:39

  • En respuesta al comentario de Zombies, ¿alguien descubrió si el restablecimiento de la conexión significa que el servidor ha cerrado la conexión?

    – Jaime

    14 de junio de 2011 a las 17:26

  • En mi experiencia con un problema similar en el pasado, la causa fue una mala conexión de red en el lado del servidor que causa demasiado tiempo de espera de las conexiones. El problema con el tiempo de espera de un Socket es que su comportamiento predeterminado no es el tiempo de espera (tiempo de espera infinito). (Continúa)

    – Filipe Palrinhas

    27 de julio de 2011 a las 11:37

  • (Continuación) Incluso HTTPClient no establece un tiempo de espera predeterminado en los sockets creados. Por otro lado, del lado del servidor, todos los sockets deben expirar después de unos minutos o las conexiones se atascarán (muy mala idea en un servidor). Entonces, si la conexión se agota en el lado del servidor, el cliente obtendrá un restablecimiento de la conexión (el servidor cerró la conexión), si el cliente se agota primero, la excepción será ConnectionTimeoutException. Dado que este es un problema transitorio, la solución es capturar y registrar todas estas excepciones y volver a intentarlo.

    – Filipe Palrinhas

    27 de julio de 2011 a las 11:38

  • @FilipePalrinhas tiene mucha razón sobre el hecho de que HttpClient no establece un tiempo de espera finito en la conexión del socket.

    – preguntas

    20 de septiembre de 2013 a las 6:01

Este error pasa de tu lado y NO del otro lado. Si el otro lado restablece la conexión, entonces el mensaje de excepción debería decir:

java.net.SocketException reset by peer

La causa es la conexión interior. HttpClient está rancio Comprobar la conexión obsoleta para SSL no corrige este error. Solución: descargue su cliente y vuelva a crear.

Si experimenta esto al intentar acceder a los servicios web implementados en un servidor Glassfish3, es posible que desee ajustar la configuración de su http-thread-pool. Eso solucionó las SocketExceptions que teníamos cuando muchos subprocesos concurrentes llamaban al servicio web.

  1. Ir a la consola de administración
  2. Vaya a “Configuraciones”->”Configuración del servidor”->”Grupos de subprocesos”->”http-thread-pool”.
  3. Cambie la configuración “Tamaño máximo del grupo de subprocesos” de 5 a 32
  4. Cambie la configuración “Tamaño mínimo del grupo de subprocesos” de 2 a 16
  5. Reinicie Glassfish.

  • Esto también me ayudó en Glassfish 4

    – Dmitri

    31 de mayo de 2018 a las 12:12

¿Que esta causando mi javanetSocketException restablecimiento de la conexion duplicate
jacob van lingen

También me encontré con este error. En mi caso el problema era que estaba usando JRE6, con soporte para TLS1.0. El servidor solo admitía TLS1.2, por lo que se generó este error.

En mi caso, esto se debió a que mi Tomcat estaba configurado con una configuración insuficiente. maxHttpHeaderSize para una consulta SOLR particularmente complicada.

¡Espero que esto ayude a alguien por ahí!

¿Que esta causando mi javanetSocketException restablecimiento de la conexion duplicate
marca

Recibo este error todo el tiempo y lo considero normal.

Ocurre cuando un lado intenta leer cuando el otro lado ya ha colgado. Por lo tanto dependiendo del protocolo esto puede o no designar un problema. Si mi código de cliente le indica específicamente al servidor que va a colgar, tanto el cliente como el servidor pueden colgar al mismo tiempo y este mensaje no sucederá.

La forma en que implemento mi código es que el cliente cuelgue sin despedirse. El servidor puede detectar el error e ignorarlo. En el contexto de HTTP, creo que un nivel del protocolo permite más de una solicitud por conexión, mientras que el otro no.

Por lo tanto, puede ver cómo potencialmente un lado podría seguir colgando del otro. Dudo que el error que está recibiendo sea de alguna preocupación pirata y simplemente podría atraparlo para evitar que llene sus archivos de registro.

1646747232 718 ¿Que esta causando mi javanetSocketException restablecimiento de la conexion duplicate
Pablo

Este error se produce en el lado del servidor cuando el cliente cerró la conexión del socket antes de que se pudiera devolver la respuesta a través del socket. En un escenario de aplicación web, no todos estos son peligrosos, ya que se pueden crear manualmente. Por ejemplo, cerrando el navegador antes de recuperar la respuesta.

  • Si bien es cierto, esta pregunta se trata de un componente del lado del cliente en el que esperaría que el servidor finalice el intercambio.

    – ashirley

    26 de julio de 2013 a las 11:08

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad