客户端中止异常:java.net.SocketException: 连接被对等方重置:套接字写入错误

24

我经常在从数据库列检索文件对象时遇到以下错误。我该如何解决这个问题?

May 8, 2009 3:18:14 PM org.apache.catalina.core.StandardHostValve status
  WARNING: Exception Processing ErrorPage[errorCode=404, location=/error.jsp]
  ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error
  at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:327)
  at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:293)
  at org.apache.catalina.connector.Response.flushBuffer(Response.java:537)
  at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:286)
  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
  at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
  at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
  at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)        
  at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
  at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
  at java.lang.Thread.run(Unknown Source)

Caused by: java.net.SocketException: Connection reset by peer: socket write error
  at java.net.SocketOutputStream.socketWrite0(Native Method)
  at java.net.SocketOutputStream.socketWrite(Unknown Source)
  at java.net.SocketOutputStream.write(Unknown Source)
  at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:746)
  at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:433)
  at org.apache.coyote.http11.InternalOutputBuffer.flush(InternalOutputBuffer.java:304)
  at org.apache.coyote.http11.Http11Processor.action(Http11Processor.java:991)
  at org.apache.coyote.Response.action(Response.java:182)
  at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:322)
  ... 13 more

1
你是否真正遇到了实际问题,还是只是在日志记录中看到了这些消息? - Arnout Engelen
这个问题涉及到一个servlet的异常。有关客户端类似问题,请参见http://stackoverflow.com/questions/34673336/httpclient-connection-reset-by-peer-socket-write-error。 - Raedwald
4个回答

40

你的HTTP客户端已断开连接。

这可能有几个原因:

  • 响应请求时间过长,客户端放弃了
  • 您回复了客户端无法理解的内容
  • 最终用户实际上取消了请求
  • 发生了网络错误
  • ...可能还有其他原因

你可以相当容易地模拟这种行为:

URL url = new URL("http://example.com/path/to/the/file");

int numberOfBytesToRead = 200;

byte[] buffer = new byte[numberOfBytesToRead];
int numberOfBytesRead = url.openStream().read(buffer);

15
根据我看来,你列出的项目中最有可能的是“最终用户实际上取消了请求”。该死的用户,总是惹麻烦 :-P - ashirley

10

根据您的日志显示,出现了ClientAbortException异常,这是由于HTTP客户端在服务器关闭服务器套接字连接之前断开了与服务器的连接。


2

我在从Google缓存中打开页面时遇到了这个错误。

我认为,缓存的页面(客户端)在加载页面时会出现断开连接的情况。

您可以使用try-catch过滤器来忽略此错误日志。


-2

Windows防火墙可能会导致这个异常,尝试禁用它或为端口甚至程序(Java)添加规则。


如果这是问题,Windows防火墙会完全阻止连接。 - user207421
以什么方式“预防”?很明显,当程序尝试打开连接时,你将会得到一个异常(在我看来是 java.net.SocketException),问题在于你将会看到什么样的消息...实际上,我通过在Windows防火墙中引入新规则来解决了“对等方重置连接:套接字写入错误”的问题。 - Yura
1
@Yura "Prevent" 的意思是在第一时间不让服务器接受客户端的连接。 - ThePyroEagle
防火墙可能会因不喜欢深度数据包检查结果而中断连接。 - buzz3791

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接