2011-01-10 42 views
12

¿Cuál es la diferencia entre java.net.SocketException: Connection reset y java.net.SocketException: Broken Pipe?¿Cuál es la diferencia entre java.net.SocketException: Connection reset y java.net.SocketException: Broken Pipe?

Estoy tratando de averiguar cuáles son las razones de estas dos excepciones. Estamos obteniendo un error de seguimiento en nuestro servidor, que es básicamente un servicio web basado en jabón. Cuando intento abortar la llamada al cliente, la excepción que veo es Tubo roto ...

A continuación se muestra el seguimiento de la pila, ¡se agradece cualquier ayuda!

2011-01-10 00:44:33,828 96893947 INFO [STDOUT] (http-0.0.0.0-8180-Processor25:) ERROR: '' 
2011-01-10 00:44:33,829 96893948 INFO [STDOUT] (http-0.0.0.0-8180-Processor25:) Jan 10, 2011 12:44:33 AM com.sun.xml.rpc.server.http.JAXRPCS 
ervletDelegate doGetDefault 
SEVERE: JAXRPCSERVLET34: transformation failed : ClientAbortException: java.net.SocketException: Connection reset 
JAXRPCSERVLET34: transformation failed : ClientAbortException: java.net.SocketException: Connection reset 
     at com.sun.xml.rpc.server.http.WSDLPublisher.handle(WSDLPublisher.java:109) 
     at com.sun.xml.rpc.server.http.JAXRPCServletDelegate.doGetDefault(JAXRPCServletDelegate.java:185) 
     at com.sun.xml.rpc.server.http.JAXRPCServletDelegate.doGet(JAXRPCServletDelegate.java:153) 
     at com.sun.xml.rpc.server.http.JAXRPCServlet.doGet(JAXRPCServlet.java:111) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:697) 
-- 
     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) 
2011-01-10 00:44:33,829 96893948 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/soa].[UserService]] (http-0.0.0.0-81 
80-Processor25:) Servlet.service() for servlet UserService threw exception 
javax.servlet.ServletException: JAXRPCSERVLET34: transformation failed : ClientAbortException: java.net.SocketException: Connection reset 
     at com.sun.xml.rpc.server.http.JAXRPCServletDelegate.doGetDefault(JAXRPCServletDelegate.java:347) 
     at com.sun.xml.rpc.server.http.JAXRPCServletDelegate.doGet(JAXRPCServletDelegate.java:153) 
     at com.sun.xml.rpc.server.http.JAXRPCServlet.doGet(JAXRPCServlet.java:111) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:697) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) 
+0

http://stackoverflow.com/questions/62929/java-net-socketexception-connection-reset –

Respuesta

4

Estas son condiciones de error en el nivel del protocolo TCP. Ambos significan básicamente que el otro lado cerró la conexión TCP. La diferencia está en qué etapa de la comunicación sucede.

+2

Interesante responde, pero podrías elaborar esto más? – vandershraaf

+0

@vandershraaf: Realmente no conozco los detalles lo suficiente como para dar más detalles, y de todos modos es poco probable que sea relevante. –

4

'Restablecimiento de la conexión' puede ocurrir al leer o escribir. 'Tubo roto' solo puede ocurrir al escribir. Ambos son causados ​​por escribir en una conexión que ya ha sido cerrada por el otro extremo, o que ha sido reiniciada por algún otro motivo.

4

Ambos Connection reset y Broken pipe se producen cuando la conexión ha sido cerrada por el par (es decir, la aplicación tiene la conexión en el otro lado).

Connection reset puede ocurrir al escribir (ver java.net.SocketOutputStream) o leer (ver java.net.SocketInputStream).

Broken pipe se produce en un método nativo de java.net.SocketException:

java.net.SocketException: Broken pipe 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) 

Por lo tanto, Broken pipe se produce en un nivel de comunicación inferior, como lo sugiere Michael Borgwardt.

En la mayoría de los casos, veo este error al enviar un PDF grande al navegador del cliente y el usuario mata el navegador antes de obtener el documento completo (en este caso, simplemente ignoro el error ya que esta fue la opción del usuario para cerrar su navegador y no hay nada que corregir). Pero podría ser por otras razones (por ejemplo, EJP suggests more reason related to data communication protocols).

+0

Ambos ocurren en el mismo nivel, y no ha proporcionado ninguna evidencia de lo contrario. – EJP

+0

@EJP: el hecho de que "Broken pipe" es arrojado por un método nativo y no por código Java que muestra que es un nivel ** de código ** más bajo. El término "nivel de comunicación" debe entenderse como "nivel de código", pero no como un nivel de la pila OSI. Supongo que, dependiendo de cuándo el cliente cierre la conexión, obtendrá una "tubería rota" o un "restablecimiento de la conexión". –

0

Ambos apuntan aparentemente a un caso similar: el socket remoto ya no está disponible para escritura.

Recientemente, con mi experimento, descubrí que Broken Pipe ocurre cuando mi servidor está en Unix env y termino el cliente.

015-06-26 10:53:51,028-0400 [ERROR][WS-ASync] (Handler.java:1168) Exception while writing ClientAbortException: java.net.SocketException: Broken pipe 
ClientAbortException: java.net.SocketException: Broken pipe 
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:413) 
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:371) 
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:438) 

Considerando que, cuando se ejecuta en Windows Sever, veo la excepción restablecimiento de conexión

2015-06-26 09:11:31,491 ERROR [WS-ASync] (Handler.java:1168) - Exception while writing ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error 
ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error 
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:388) 
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:462) 
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366) 
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:413) 
     at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366) 
Cuestiones relacionadas