144 java sockets post exception
我正在使用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)
Run Code Online (Sandbox Code Playgroud)
有人可以建议导致此异常的原因以及如何调试它吗?
use*_*421 76
这是因为当另一端已经关闭连接时写入连接.
因此,您的应用程序协议定义不明确或已实现.
小智 30
在我们的案例中,我们在应用服务器上执行负载测试时遇到了这种情况.问题是我们需要为JVM添加额外的内存,因为它已经用完了.这解决了这个问题.
尝试增加JVM可用的内存,或者在出现这些错误时监视内存使用情况.
SocketException:管道损坏,是由代码读取或写入连接时关闭连接的"另一端"(客户端或服务器)引起的.
这是客户端/服务器应用程序中非常常见的例外,它从应用程序控件之外的客户端或服务器接收流量.例如,客户端是浏览器.如果浏览器进行Ajax调用,和/或用户只是关闭页面或浏览器,那么这可以有效地意外地终止所有通信.基本上,只要另一端终止其应用程序,您就会看到此错误,并且您没有预料到它.
如果您在应用程序中遇到此异常,那么这意味着您应检查发生IO(输入/输出)的代码,并使用try/catch块将其包装以捕获此IOException.然后,由您决定如何处理这种半有效的情况.
在你的情况,最早的地方,你还是得控制是调用HttpMethodDirector.executeWithRetry-所以确保调用包装用try/catch块,并处理它,你怎么认为合适的.
我强烈建议不要在调试/跟踪级别以外的任何地方记录SocketException-Broken Pipe特定错误.否则,这可以通过填充日志作为DOS(拒绝服务)攻击的一种形式.针对这种常见情况,尝试并强化并对您的应用程序进行负面测试.
小智 5
所有打开的流和连接都需要正确关闭,所以下次我们尝试使用 urlConnection 对象时,它不会抛出错误。例如,以下代码更改为我修复了错误。
前:
OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
bw.write("Some text");
bw.close();
out.close();
Run Code Online (Sandbox Code Playgroud)
后:
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.
Run Code Online (Sandbox Code Playgroud)