简体   繁体   English

java.net.SocketException有什么区别:Connection reset和java.net.SocketException:Broken Pipe?

[英]What is the difference between java.net.SocketException: Connection reset and java.net.SocketException: Broken Pipe?

What is the difference between java.net.SocketException: Connection reset and java.net.SocketException: Broken Pipe ? java.net.SocketException: Connection reset什么区别java.net.SocketException: Connection resetjava.net.SocketException: Broken Pipe

I am trying to figure what are the reasons for these two exceptions. 我想弄清楚这两个例外的原因是什么。 We are getting following error on our server, which is basically a soap based webservice. 我们的服务器上出现以下错误,基本上是基于SOAP的Web服务。 When I try to abort the client call the exception I am seeing is Broken pipe... 当我尝试中止客户端调用我看到的异常是Broken pipe ...

Following is the stack trace we, any help is appreciated! 以下是我们的堆栈跟踪,任何帮助表示赞赏!

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)

Both Connection reset and Broken pipe occurs when the connection has been closed by the peer (ie application holding the connection at the other side). 当对等方关闭连接时(即在另一侧保持连接的应用程序),都会发生Connection resetBroken pipe

Connection reset can occur when writing (see java.net.SocketOutputStream ) or reading (see java.net.SocketInputStream ). 写入(请参阅java.net.SocketOutputStream )或读取(请参阅java.net.SocketInputStream )时可能会发生Connection reset

Broken pipe occurs in a Native method of java.net.SocketException : Broken pipe发生在java.net.SocketException的Native方法中:

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

Thus, Broken pipe occurs at a lower communication level, as Michael Borgwardt suggested. 因此,正如Michael Borgwardt建议的那样, Broken pipe发生在较低的通信水平。

In most cases, I see this error when sending a big PDF to the client browser and the user kills the browser before getting the whole document (in this case, I simply ignore the error since this was the user choice to close its browser and there is nothing to correct). 在大多数情况下,我在向客户端浏览器发送大型PDF时看到此错误,并且用户在获取整个文档之前杀死了浏览器(在这种情况下,我只是忽略了错误,因为这是用户选择关闭其浏览器并在那里没有什么可以纠正的)。 But it could be other reasons (eg EJP suggests more reason related to data communication protocols ). 但这可能是其他原因(例如, EJP建议更多与数据通信协议相关的原因 )。

These are error conditions on the TCP protocol level. 这些是TCP协议级别的错误条件。 Both of them basically mean that the other side closed the TCP connection. 它们都基本上意味着另一方关闭了TCP连接。 The difference is in what stage of communication that happens. 不同之处在于发生的沟通阶段。

'Connection reset' can occur when reading or writing. 读取或写入时可能会发生“连接重置”。 'Broken pipe' can only occur when writing. '断管'只能在写字时出现。 Both are caused by writing to a connection that has already been closed by the other end, or that has been reset for some other reason. 两者都是由写入已被另一端关闭的连接或由于某些其他原因而被重置的连接引起的。

Both are seemingly pointing to similar case - remote socket is no longer available for write. 两者似乎都指向类似的情况 - 远程套接字不再可用于写入。

Recently with my experiment, I found that Broken pipe occurs when my serve is on Unix env and I terminate the client. 最近通过我的实验,我发现当我的服务器在Unix环境中时我发生了断管,我终止了客户端。

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)

Whereas, when sever runs on windows, I see the connection reset exception 然而,当服务器在Windows上运行时,我看到连接重置异常

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM