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

我正在使用apache commons http客户端使用post方法调用url来发布参数,并且它很少抛出以下错误。


java.net.SocketException: Broken pipe

        at java.net.SocketOutputStream.socketWrite0(Native Method)

        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)

        at java.net.SocketOutputStream.write(SocketOutputStream.java:136)

        at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105)

        at java.io.FilterOutputStream.write(FilterOutputStream.java:80)

        at org.apache.commons.httpclient.methods.ByteArrayRequestEntity.writeRequest(ByteArrayRequestEntity.java:90)

        at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:499)

        at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114)

        at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)

        at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)

有人可以建议导致此异常的原因以及如何调试它吗?


慕少森
浏览 899回答 3
3回答

慕标5832272

这是由:最常见的是,当另一端已经关闭时写入连接;通常情况下,对等体关闭连接而不读取其末尾已经挂起的所有数据。因此,在这两种情况下,您的应用程序协议定义都很糟糕。还有第三个原因,我不会在这里记录,但涉及对等方采取故意行动重置而不是正确关闭连接。

呼唤远方

SocketException:管道损坏,是由代码读取或写入连接时关闭连接的“另一端”(客户端或服务器)引起的。这是客户端/服务器应用程序中非常常见的例外,它从应用程序控件之外的客户端或服务器接收流量。例如,客户端是浏览器。如果浏览器进行Ajax调用,和/或用户只是关闭页面或浏览器,那么这可以有效地杀死所有通信。基本上,只要另一端终止其应用程序,您就会看到此错误,并且您没有预料到它。如果您在应用程序中遇到此异常,那么这意味着您应检查发生IO(输入/输出)的代码,并使用try / catch块将其包装以捕获此IOException。然后,由您决定如何处理这种半有效的情况。在你的情况下,你仍然可以控制的最早的地方就是调用HttpMethodDirector.executeWithRetry- 所以确保调用是用try / catch块包装的,并按照你认为合适的方式处理它。我强烈建议不要在调试/跟踪级别以外的任何地方记录SocketException-Broken Pipe特定错误。否则,这可以通过填充日志作为DOS(拒绝服务)攻击的一种形式。针对这种常见情况,尝试并强化并对您的应用程序进行负面测试。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java