为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕少森 2019-09-20 17:02:10
我正在使用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)有人可以建议导致此异常的原因以及如何调试它吗?
查看完整描述

3 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

这是由:

  • 最常见的是,当另一端已经关闭时写入连接;

  • 通常情况下,对等体关闭连接而不读取其末尾已经挂起的所有数据。

因此,在这两种情况下,您的应用程序协议定义都很糟糕。

还有第三个原因,我不会在这里记录,但涉及对等方采取故意行动重置而不是正确关闭连接。


查看完整回答
反对 回复 2019-09-20
?
呼唤远方

TA贡献1856条经验 获得超11个赞

SocketException:管道损坏,是由代码读取或写入连接时关闭连接的“另一端”(客户端或服务器)引起的。

这是客户端/服务器应用程序中非常常见的例外,它从应用程序控件之外的客户端或服务器接收流量。例如,客户端是浏览器。如果浏览器进行Ajax调用,和/或用户只是关闭页面或浏览器,那么这可以有效地杀死所有通信。基本上,只要另一端终止其应用程序,您就会看到此错误,并且您没有预料到它。

如果您在应用程序中遇到此异常,那么这意味着您应检查发生IO(输入/输出)的代码,并使用try / catch块将其包装以捕获此IOException。然后,由您决定如何处理这种半有效的情况。

在你的情况下,你仍然可以控制的最早的地方就是调用HttpMethodDirector.executeWithRetry- 所以确保调用是用try / catch块包装的,并按照你认为合适的方式处理它。

我强烈建议不要在调试/跟踪级别以外的任何地方记录SocketException-Broken Pipe特定错误。否则,这可以通过填充日志作为DOS(拒绝服务)攻击的一种形式。针对这种常见情况,尝试并强化并对您的应用程序进行负面测试。


查看完整回答
反对 回复 2019-09-20
  • 3 回答
  • 0 关注
  • 897 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信