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

Bab*_*u R 20 java servlets socketexception

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

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
Run Code Online (Sandbox Code Playgroud)

我的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();
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

Dmi*_*try 12

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

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

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


Aub*_*bin 3

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

您的代码中的一个错误:

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

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

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

这不是你的问题,而是我的答案......;-)

  • 虽然您将正确长度的字节写入流是正确的,但这不应导致“连接由对等方重置”错误。客户端应该在正确的数据之后看到一些垃圾。 (4认同)