当我从服务器读取文件内容时,它返回以下错误消息:
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();
如何解决这个问题?
答案 0 :(得分:11)
我有同样的例外,在我的情况下,问题出在重新谈判过程中。事实上,当服务器尝试更改密码套件时,我的客户端关闭了连接。在挖掘之后,它似乎出现在jdk 1.6 update 22 renegotiation process is disabled by default中。如果您的安全约束可以解决此问题,请尝试通过将sun.security.ssl.allowUnsafeRenegotiation
系统属性设置为true
来启用不安全的重新协商。以下是有关该流程的一些信息:
会话重新协商是SSL协议中的一种机制 允许客户端或服务器在此期间触发新的SSL握手 正在进行的SSL通信。重新谈判最初设计为 一种提高正在进行的SSL通道安全性的机制 触发用于保护该频道的加密密钥的更新。 但是,现代加密不需要这种安全措施 算法。此外,服务器可以使用重新协商 请求客户端证书(为了执行客户端 验证)当客户端尝试访问特定的,受保护的 服务器上的资源。
此外,excellent post详细介绍了此问题,并以(IMHO)可理解的语言编写。
答案 1 :(得分:3)
套接字已被客户端(浏览器)关闭。
代码中的错误:
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 );
}
这不是你的问题,但这是我的答案......; - )
答案 2 :(得分:0)
“解决”它的正确方法是关闭连接并忘记客户端。当你还在写信的时候,客户已关闭连接,所以他不想认识你,所以就是这样,不是吗?
答案 3 :(得分:0)
似乎你的问题可能出现在
while(in.read(outputByte,0,4096)!=-1){
它可能会进入无限循环而不会提前偏移(在调用中始终为0)。试试
while(in.read(outputByte)!=-1){
默认情况下会尝试将outputByte.length读入byte[]
。这样你就不用担心偏移了。见FileInputStrem's read method
答案 4 :(得分:0)
我遇到了同样的问题:
冲洗时出现异常
这是一个不同的stackoverflow issue。简要说明是错误的响应标头设置:
response.setHeader(“Content-Encoding”,“gzip”);
尽管未压缩的响应数据内容。
因此浏览器关闭了连接。