在使用迅雷下载大文件(比如说10m的文件,下载几十K的文件没有问题)时出现的错误
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:747)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:432)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:347)
at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:770)
at org.apache.coyote.http11.filters.IdentityOutputFilter.doWrite(IdentityOutputFilter.java:118)
at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:580)
at org.apache.coyote.Response.doWrite(Response.java:560)
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:361)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:352)
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:392)
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:381)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89)
at com.jspsmart.upload.SmartUpload.downloadFile(SmartUpload.java:301)
at com.jspsmart.upload.SmartUpload.downloadFile(SmartUpload.java:261)
at com.jspsmart.upload.SmartUpload.downloadFile(SmartUpload.java:249)
at org.apache.jsp.order.download_jsp._jspService(download_jsp.java:80)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at com.goldenberg.erp.public_obj.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:99)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Unknown Source)
下载代码如下:
  public void downloadFile(String s)
        throws ServletException, IOException, SmartUploadException
    {
        downloadFile(s, null, null);
    }    public void downloadFile(String s, String s1)
        throws ServletException, IOException, SmartUploadException, SmartUploadException
    {
        downloadFile(s, s1, null);
    }    public void downloadFile(String s, String s1, String s2)
        throws ServletException, IOException, SmartUploadException
    {
        downloadFile(s, s1, s2, 65000);
    }    public void downloadFile(String s, String s1, String s2, int i)
        throws ServletException, IOException, SmartUploadException
    {
        if(s == null)
            throw new IllegalArgumentException("File '" + s + "' not found (1040).");
        if(s.equals(""))
            throw new IllegalArgumentException("File '" + s + "' not found (1040).");
        if(!isVirtual(s) && m_denyPhysicalPath)
            throw new SecurityException("Physical path is denied (1035).");
        if(isVirtual(s))
            s = m_application.getRealPath(s);
        File file = new File(s);
        FileInputStream fileinputstream = new FileInputStream(file);
        long l = file.length();
        boolean flag = false;
        int k = 0;
        byte abyte0[] = new byte[i];
        if(s1 == null)
            m_response.setContentType("application/x-msdownload");
        else
        if(s1.length() == 0)
            m_response.setContentType("application/x-msdownload");
        else
            m_response.setContentType(s1);
        m_response.setContentLength((int)l);
        m_contentDisposition = m_contentDisposition != null ? m_contentDisposition : "attachment;";
        if(s2 == null)
            m_response.setHeader("Content-Disposition", m_contentDisposition + " filename=" + getFileName(s));
        else
        if(s2.length() == 0)
            m_response.setHeader("Content-Disposition", m_contentDisposition);
        else
            m_response.setHeader("Content-Disposition", m_contentDisposition + " filename=" + s2);
        while((long)k < l) 
        {
            int j = fileinputstream.read(abyte0, 0, i);
            k += j;
            m_response.getOutputStream().write(abyte0, 0, j);
        }
        fileinputstream.close();
    }
麻烦大家看看,是哪里出了问题?

解决方案 »

  1.   

    java.net.SocketException: Connection reset by peer: socket write error
    出现这种问题就是,文件你还没有下载完,客户端关闭连接就会抛出这个异常。看你的程序不知道你哪里使用的迅雷?
    如果真的调用迅雷的话,就可能是因为迅雷断点续传,当迅雷下载的一个链接中断时,你的程序就会抛出这个异常。
      

  2.   

    java.net.SocketException: Connection reset by peer: socket write error应该是服务器端的socket连接关闭了...
      

  3.   

    那弹出迅雷后,你点取消。用window 那种弹出对话框另存为下载,看是否还会出现异常。以前我做图片下载的时候,弹出对话框开始下载图片。下载的过程中点击取消按钮,服务器端就会报这个错误。
      

  4.   

    byte abyte0[] = new byte[i];用定长的数组,比如byte abyte0[] = new byte[1024];我记得之前有人问过这个问题。