如何解决java.net.SocketException:损坏的pipe道?

我使用的Apache公共的HTTP客户端调用URL使用POST方法发布参数,它很less抛出下面的错误。

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) 

有人可以build议是什么导致这个exception,以及如何debugging?

这是由于在另一端已经closures的情况下写入连接而造成的。

所以你有一个定义不好的或实现的应用程序协议。

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

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

所有打开的stream和连接都需要正确closures,所以下次我们尝试使用urlConnection对象时,它不会引发错误。 作为一个例子,下面的代码更改修复了我的错误。

之前:

 OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream()); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out)); bw.write("Some text"); bw.close(); out.close(); 

后:

 OutputStream os = urlConnection.getOutputStream(); OutputStream out = new BufferedOutputStream(os); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out)); bw.write("Some text"); bw.close(); out.close(); os.close(); // This is a must. 

我已经通过FTP服务器实现了数据下载function,并且在恢复下载时也发现了相同的exception。 要解决此exception,您将始终必须从以前的会话断开连接,并创build客户端的新实例以及与服务器的新连接。 同样的方法也可以对HTTPClient有帮助。

问题可能是您的已部署文件没有使用正确的RMI方法进行更新。 检查您的RMI接口是否已经更新了参数,或者更新了客户端没有的数据结构。 或者您的RMI客户端没有任何与您的服务器版本不同的参数。

这只是一个受过教育的猜测。 在重新部署我的服务器应用程序的类文件并重新testing之后,“断开的pipe道”的问题就消失了。

原因是远程对等closures它的套接字(例如崩溃),所以如果你尝试写数据给他,例如,你会得到这个。 为了解决这个问题,插入读/写套接字操作之间:

  try { /* your code */ } catch (SocketException e) { e.printStackTrace(); } 

JavaDoc的:

传入连接指示(连接请求)的最大队列长度设置为50.如果连接指示在队列满时到达,连接将被拒绝。

例如,您应该增加ServerSocket的“backlog”参数

 int backlogSize = 50 ; new ServerSocket(port, backlogSize);