【问题标题】:How to solve "Connection reset by peer: socket write error"? [closed]如何解决“对等方重置连接:套接字写入错误”? [关闭]
【发布时间】:2012-10-10 19:02:52
【问题描述】:

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

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();

如何解决这个问题?

【问题讨论】:

  • 什么是客户端,如果是你写的,它是如何读取响应的?
  • 在 output.write() 行中发布指示错误的堆栈跟踪。像 Serge 要求的那样,如果适用,也请发布客户端代码。
  • 我通过 jquery ajax 函数向这个 servlet 发出了请求。
  • 我在div的onclick()中下载了一个文件。
  • @BabuR 你找到解决这个问题的方法了吗?我在尝试通过 servlet 传输视频时遇到同样的问题。

标签: java servlets socketexception


【解决方案1】:

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

在刷新时引发异常

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

response.setHeader("Content-Encoding", "gzip");

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

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

【讨论】:

    【解决方案2】:

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

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

    另外还有excellent post关于此问题的详细信息,并以(恕我直言)可理解的语言编写。

    【讨论】:

      【解决方案3】:

      看来您的问题可能出现在

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

      它可能会因为不推进偏移量而进入无限循环(在调用中始终为 0)。试试

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

      默认情况下会尝试将最多 outputByte.length 读入byte[]。这样您就不必担心偏移量。见FileInputStrem's read method

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 你能告诉我如何关闭连接吗?
        • @BabuR 关闭输出流。
        【解决方案5】:

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

        代码中的错误:

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

        最后一个包读,然后写可能长度

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

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

        【讨论】:

        • 虽然您对将正确长度的字节写入流是正确的,但这不应导致“对等方重置连接”错误。客户端应该只是在正确的数据之后看到一些垃圾。
        • 感谢您的回复。我试过你的代码。但它显示 java.lang.IndexOutOfBoundsException
        • 我解决了 indexoutofbounds pbm。但我问的同样的问题仍然存在:\
        • java.net.SocketException:对等方重置连接:org.apache.tomcat.util 中 org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:388) 处的套接字写入错误。 buf.ByteChunk.flushBuffer(ByteChunk.java:462) 在 org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366) 在 org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java: 413) 在 org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:401) 在 org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:91)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-12
        • 2018-08-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-31
        • 1970-01-01
        相关资源
        最近更新 更多