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

Posted

技术标签:

【中文标题】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?java.net.SocketException: Connection reset 和 java.net.SocketException: Broken Pipe 有什么区别? 【发布时间】:2011-06-06 20:04:29 【问题描述】:

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

我试图弄清楚这两个异常的原因是什么。我们的服务器上出现以下错误,这基本上是一个基于肥皂的网络服务。当我尝试中止客户端调用时,我看到的异常是 Broken pipe...

以下是我们的堆栈跟踪,感谢任何帮助!

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)

【问题讨论】:

***.com/questions/62929/… 【参考方案1】:

读取或写入时可能发生“连接重置”。 'Broken pipe' 只能在写入时发生。两者都是由于写入已被另一端关闭的连接或因其他原因而重置的连接。

【讨论】:

【参考方案2】:

Connection resetBroken pipe 都在连接已被对等方关闭时发生(即在另一端持有连接的应用程序)。

Connection reset 可以在写入(参见java.net.SocketOutputStream)或读取(参见java.net.SocketInputStream)时发生。

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)

因此,正如 Michael Borgwardt 所建议的,Broken pipe 出现在较低的通信级别。

在大多数情况下,我在向客户端浏览器发送大 PDF 时看到此错误,并且用户在获取整个文档之前终止了浏览器(在这种情况下,我只是忽略了该错误,因为这是用户选择关闭其浏览器,没有什么可纠正的)。但也可能是其他原因(例如EJP suggests more reason related to data communication protocols)。

【讨论】:

两者发生在同一级别,您没有提供相反的证据。 @EJP:“Broken pipe”是由本机方法而不是由 Java 代码抛出的,这表明它是较低的 code 级别。术语“通信级别”应理解为“代码级别”,而不是 OSI 堆栈的级别。我的猜测是,根据客户端关闭连接的时间,您会得到“管道损坏”或“连接重置”。【参考方案3】:

这些是 TCP 协议级别的错误条件。这两个基本上都意味着对方关闭了TCP连接。不同之处在于发生的沟通阶段。

【讨论】:

有趣的答案,但你能详细说明一下吗? @vandershraaf:我真的不太了解细节,无法详细说明,而且这不太可能是相关的不同。【参考方案4】:

两者似乎都指向类似的情况 - 远程套接字不再可用于写入。

最近在我的实验中,我发现当我的服务在 Unix 环境上并且我终止客户端时会发生 Broken pipe。

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)

然而,当服务器在 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)

【讨论】:

以上是关于java.net.SocketException: Connection reset 和 java.net.SocketException: Broken Pipe 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

是啥导致我的 java.net.SocketException:连接重置? [复制]

如何修复 java.net.SocketException:损坏的管道?

Java 1.6 HttpsURLConnection:java.net.SocketException:连接重置

java.net.SocketException:recvfrom 失败:ETIMEDOUT(连接超时)

java.net.SocketException:软件导致连接中止:recv 失败 [重复]

如何解决 java.net.SocketException:使用 selenium 的 java 中的连接重置异常?