如何解决“通过对等方重置连接:套接字写入错误”?

当我从服务器读取文件内容时,它返回以下错误消息:

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:215) at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:462) at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366) at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:240) at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:119) at org.apache.coyote.http11.AbstractOutputBuffer.doWrite(AbstractOutputBuffer.java:192) at org.apache.coyote.Response.doWrite(Response.java:504) at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:383) ... 28 more 

我的servlet程序是

  response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition","attachment;filename="+filename); FileInputStream in = new FileInputStream(new File(filepath)); ServletOutputStream output=response.getOutputStream(); byte[] outputByte=new byte[4096]; while(in.read(outputByte,0,4096)!=-1){ output.write(outputByte,0,4096);//error indicates in this line } in.close(); output.flush(); output.close(); 

如何解决这个问题?

我有同样的例外,在我的情况下问题出在重新谈判过程中。 事实上,当服务器尝试更改密码套件时,我的客户端关闭了连接。 在挖掘之后,似乎在jdk 1.6 update 22 中默认禁用了重新协商过程 。 如果您的安全约束可以解决此问题,请尝试通过将sun.security.ssl.allowUnsafeRenegotiation system属性设置为true来启用不安全的重新协商。 以下是有关该过程的一些信息:

会话重新协商是SSL协议中的一种机制,允许客户端或服务器在正在进行的SSL通信期间触发新的SSL握手。 重新协商最初被设计为一种机制,通过触发用于保护该信道的加密密钥的更新来增加正在进行的SSL信道的安全性。 但是,现代加密算法不需要这种安全措施。 此外,当客户端尝试访问服务器上的特定受保护资源时,服务器可以使用重新协商来请求客户端证书(以便执行客户端身份validation)。

此外,还有关于此问题的优秀post ,并以(IMHO)可理解的语言编写。

套接字已被客户端(浏览器)关闭。

代码中的错误:

 byte[] outputByte=new byte[4096]; while(in.read(outputByte,0,4096)!=-1){ output.write(outputByte,0,4096); } 

最后一个数据包读取,然后写入的长度可能<4096,所以我建议:

 byte[] outputByte=new byte[4096]; int len; while(( len = in.read(outputByte, 0, 4096 )) > 0 ) { output.write( outputByte, 0, len ); } 

这不是你的问题,但这是我的答案…… 😉

“解决”它的正确方法是关闭连接并忘记客户端。 当你还在写信的时候,客户已经关闭了连接,所以他不想知道你,所以就是这样,不是吗?

看起来你的问题可能会出现在

while(in.read(outputByte,0,4096)!=-1){

它可能会进入一个无限循环,因为它没有推进偏移量(在调用中始终为0)。 尝试

while(in.read(outputByte)!=-1){

这将默认尝试读取outputByte.length到byte[] 。 这样你就不用担心偏移了。 请参阅FileInputStrem的read方法

我有同样的问题,差别很小:

在冲洗时提出例外

这是一个不同的stackoverflow问题 。 简要说明是错误的响应标头设置:

response.setHeader(“Content-Encoding”,“gzip”);

尽管未压缩的响应数据内容。

所以连接被浏览器关闭了。