小弟最近做了个servlet文件下载,  在浏览器中会弹出下载框, 但是点击取消下载按钮的时候, 控制台出现了错误,
ClientAbortException:  java.net.SocketException: Connection reset 
,时间一长,tomcat就卡死了。
我的servlet:public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setHeader("Cache-Control","no-cache");
response.setContentType("application/x-msdownload");
response.setCharacterEncoding("UTF-8");
String tempid = request.getParameter("id").toString();
if(tempid!=null || !tempid.equals("")){
String basePath = getServletContext().getRealPath("/");
String url = basePath+getUrlById(tempid);   //文件路径
            //创建输出流
OutputStream out = null;
FileInputStream fis = null;
try {
out = response.getOutputStream();
//打开输入流
File file = new File(url);
fis = new FileInputStream(file);
String fname = file.getName();   //获取文件名
response.setContentLength((int)file.length());     //设置文件流大小, 弹出下载框显示进度
response.addHeader("Content-disposition","attachment;filename=" + new String(fname.getBytes("gbk"),"iso-8859-1"));


byte[] b = new byte[1024];
int i =0;
while((i=fis.read(b,0,b.length))!=-1){
out.write(b,0,i);
}
out.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
fis.close();
out.close();
}
}

}控制台:
ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:358)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:434)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:349)
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:381)
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:370)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89)
at one.DownloadMobile.doPost(DownloadMobile.java:45)
at one.DownloadMobile.doGet(DownloadMobile.java:16)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.ecside.filter.ECSideFilter.doFilter(ECSideFilter.java:188)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Unknown Source)
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:740)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:434)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:349)
at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:764)
at org.apache.coyote.http11.filters.IdentityOutputFilter.doWrite(IdentityOutputFilter.java:118)
at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:573)
at org.apache.coyote.Response.doWrite(Response.java:560)
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:353)
... 28 more希望各位大侠看了之后给小弟指点一下

解决方案 »

  1.   

    1、这个问题一般是客户端在连接还没有完全建立的时候就取消连接,比如用户按了浏览器上面的“停止”按钮,一般来说没有什么问题。但是如果频繁出现,就表示很多客户端连接到Apache服务器的响应时间太长了,可能是网络的问题或者服务器性能问题 可能你的网络连接存在一些问题,你的数据传输的时候,可能由于时间等待的太久,但是server段设置的连接检验时间限制一定,那么就可能出现这种情况的! 
    2、ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error的原因是由于处理http连接时,正在输出内容时,用户关闭了IE,会出现一个"ClientAbortException",属于I/O处理中出现的一个异常,应用服务器应该会捕捉。3、应该是线程被占用的太多了 无法控制了
    经常出现的Connection reset by peer: 原因可能是多方面的,不过更常见的原因是:
    ①:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉;
    ②:客户关掉了浏览器,而服务器还在给客户端发送数据;
    ③:浏览器端按了Stop