2011-01-10 4 views
12

Qual è la differenza tra java.net.SocketException: Connection reset e java.net.SocketException: Broken Pipe?Qual è la differenza tra java.net.SocketException: Connection reset e java.net.SocketException: Broken Pipe?

Sto cercando di capire quali sono le ragioni di queste due eccezioni. Stiamo ricevendo errore sul nostro server, che è fondamentalmente un servizio web basato su sapone. Quando provo ad abortire il client, l'eccezione che sto vedendo è Broken pipe ...

Di seguito è riportato lo stack trace, qualsiasi aiuto è apprezzato!

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 –

risposta

4

Queste sono condizioni di errore a livello di protocollo TCP. Entrambi significano sostanzialmente che l'altro lato ha chiuso la connessione TCP. La differenza è in quale fase della comunicazione accade.

+2

Interessante rispondi, ma potresti elaborarlo di più? – vandershraaf

+0

@vandershraaf: Non conosco i dettagli abbastanza bene da elaborare, ed è improbabile che sia comunque rilevante. –

4

'Reset connessione' può verificarsi durante la lettura o la scrittura. 'Broken pipe' può verificarsi solo durante la scrittura. Entrambi sono causati dalla scrittura su una connessione che è già stata chiusa dall'altra estremità o che è stata ripristinata per qualche altro motivo.

4

Entrambe Connection reset e Broken pipe si verificano quando la connessione è stata chiusa dal peer (vale a dire l'applicazione che mantiene la connessione sull'altro lato).

Connection reset può verificarsi durante la scrittura (vedere java.net.SocketOutputStream) o la lettura (vedere java.net.SocketInputStream).

Broken pipe avviene in un metodo nativo di java.net.SocketException:

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

Così, Broken pipe si verifica ad un livello inferiore di comunicazione, come suggerito Michael Borgwardt.

Nella maggior parte dei casi, vedo questo errore quando invio un grosso PDF al browser client e l'utente uccide il browser prima di ottenere l'intero documento (in questo caso, semplicemente ignoro l'errore poiché questa era la scelta dell'utente da chiudere il suo browser e non c'è nulla da correggere). Ma potrebbero essere altri motivi (ad esempio EJP suggests more reason related to data communication protocols).

+0

Entrambe si verificano allo stesso livello e non hai fornito prove del contrario. – EJP

+0

@EJP: il fatto che "Broken pipe" sia lanciato da un metodo nativo e non da un codice Java che mostra che si tratta di un livello ** code ** inferiore. Il termine "livello di comunicazione" dovrebbe essere inteso come "livello di codice", ma non come livello dello stack OSI. La mia ipotesi è che a seconda di quando il client chiude la connessione, si ottiene un "pipe rotto" o un "reset della connessione". –

0

Entrambi sembrano indicare un caso simile: la presa remota non è più disponibile per la scrittura.

Recentemente con il mio esperimento, ho scoperto che Broken pipe si verifica quando il mio servizio è su Unix env e chiudo il client.

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 che, quando sever gira su Windows, vedo l'eccezione di reset collegamento

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)