当前位置: 首页 > 知识库问答 >
问题:

如何修复java.net.SocketExc0019:管道破裂?

汪甫
2023-03-14

我使用ApacheCommons http客户端调用url,使用post方法发布参数,它很少抛出以下错误。

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个答案

邵和硕
2023-03-14

断开的管道,是由'另一端'(客户端或服务器)关闭连接引起的,而您的代码正在读取或写入连接。

在从应用程序控制之外的客户端或服务器接收流量的客户端/服务器应用程序中,这是一个非常常见的异常。例如,客户端是一个浏览器。如果浏览器发出Ajax调用,和/或用户只是关闭页面或浏览器,那么这可能会有效地意外终止所有通信。基本上,当另一端终止他们的应用程序时,你会看到这个错误,而你没有预料到。

如果您在应用程序中遇到这个异常,那么这意味着您应该检查您的代码中出现输入/输出的地方,并用一个尝试/捕获块将其包装起来以捕获这个IOExc0019。然后,由您决定如何处理这种半有效的情况。

在你的例子中,你仍然有控制权的最早的地方是调用HttpMEOD-irector.executeRetry-所以确保调用用try/catch块包装,并以你认为合适的方式处理它。

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

房学
2023-03-14

在我们的例子中,我们在应用服务器上执行负载测试时遇到了这种情况。问题是,我们需要向JVM添加额外的内存,因为它已经用完了。这解决了问题。

尝试增加JVM可用的内存,或者在出现这些错误时监视内存使用情况。

庞安晏
2023-03-14

这是由以下原因造成的:

  • 最常见的情况是,在另一端已经关闭连接时向其写入数据
  • 不太常见的情况是,对等方在没有读取其端已挂起的所有数据的情况下关闭连接

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

还有第三个原因,我将不在这里进行说明,但这涉及到同龄人故意采取行动重置连接,而不是正确关闭连接。

 类似资料:
  • 我在一个java程序上工作(不能显示代码),即使我没有使用套接字的经验,无论如何,我一直得到一个异常,我似乎不能抓住。 所有的异常都说:"java.net.SocketExcema: Broken Pipe"。 有什么想法吗? 编辑: 很抱歉我不清楚,我试图在这个异常上使用try/catk语句,因为我的程序期望另一端在某个时候断开连接,但我不希望这会杀死我的应用程序。 编辑2 哦,我现在觉得自己太

  • 问题内容: 我正在使用apache commons http客户端使用post方法来调用url来发布参数,并且很少抛出以下错误。 有人可以建议导致此异常的原因以及如何对其进行调试吗? 问题答案: 原因是: 最通常的是,在另一端已经关闭连接时写入连接; 通常,对等方关闭连接而不读取其末端已经挂起的所有数据。 因此,在两种情况下,你的应用程序协议定义或实施都不充分。 还有第三个原因,我在这里不做记录,

  • 我有一个非常奇怪的问题,我希望你的眼睛能帮助解决它。 我定义了一个函数,它通过BASH连接到Oracle SQL数据库。连接后,我使用一个herdeoc传入一个简单的select语句,该语句查找最大订阅id并递增它,具体取决于函数被调用的次数。代码如下: 在命令行调用函数时,上述代码非常有效: 但是,当函数通过管道传输到AWK语句时,函数不再抖动,这毫无意义!请参阅下面的输出: 我不明白。哈哈,我

  • 问题内容: 目前,我正在使用内置于python的应用程序。当我在个人计算机上运行它时,它不会出现问题。 但是,当我将其移至生产服务器时。它不断向我显示以下错误: 我进行了一些研究,得出的原因是,当服务器仍在忙于发送数据时,最终用户浏览器会停止连接。 我想知道为什么会发生这种情况,以及根本原因是什么导致它无法在生产服务器上正常运行,而我的计算机却可以正常运行。任何建议表示赞赏 问题答案: 您的服务器

  • 我在tomcat7上使用Solr 4.3。当并发写入和读取的数量增加时,会引发此SocketException错误。我通过多个客户端进行并发提交和搜索。感谢您的任何帮助。这是tomcat日志(catalina.out)和solr。日志

  • 问题内容: 该程序连接到服务器,并且当服务器关闭连接时,如果我尝试重新连接,它会说: 如果我关闭客户端中的套接字,然后尝试重新连接,它会说:。 有没有办法在管道破裂后重新连接它而不创建新的套接字? 问题答案: 假设这是一个面向连接的套接字: 否。您必须关闭旧的插座并创建一个新的插座,