ClientAbortException: java.net.SocketException

本文探讨了在使用Tomcat服务器时遇到的ClientAbortException及java.net.SocketException问题,分析了异常产生的原因,并提供了解决思路,包括代码修改建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ClientAbortException: java.net.SocketException

<!--问题内容-->

一大早打开远程连接就看到了这个错误,以为我的程序出了问题,GOOGLE一番发现这是TOMCAT6的问题,客户端在请求tomcat时,浏览器中途强行STOP就会出现!不知道有什么好的解决办法?
在网上查找了了下原因,大概归结为:
ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error的原因是由于处理http连接时,正在输出内容时,用户关闭了IE,会出现一个"ClientAbortException",属于I/O处理中出现的一个异常,应用服务器应该会捕捉。
Connection reset by peer的原因:
经常出现的Connection reset by peer: 原因可能是多方面的,不过更常见的原因是:
①:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉;
②:客户关掉了浏览器,而服务器还在给客户端发送数据;
③:浏览器端按了Stop

基本上没有解决办法,只有去修改TOMCAT的源代码!
==================
昨天同事要我帮助另一个女同事完成上传用户头像和下载用户头像的后台功能,今早测的时候发现:
通过IE,在地址栏输入下载图片的url没有报错,而通过同事做的桌面客户端(VC++)发来的请求却报
2009-10-23 10:52:11 org.apache.catalina.core.ApplicationContext log
信息: ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error
 这是什么原因?
网上google了一下,看到该帖子: http://www.programfan.com/club/showpost.asp?id=27999
其中:
我把你的代码拷过来,又写了一个客户端,试了一下,没问题,能用,只是:
byte[] zijie=new byte[1024];          
while(input.read(zijie)>0)
{
    output.write(zijie);
    output.flush();
}
要注意最后一次读到的有可能是不满的,所以不能把整个zijie写出去,要用
output.write(zijie,0,len);
在循环外定义:
int len=0;
while((len=input.read(zijie))>0){
    ...
}
也就是读到多少写多少,否则最后一次是会把上一次的残留也写出去的。
另外就是虽然没问题能运行,但还是要把关流的代码写在finally里比较安全。
原来的代码是:后台直接根据文件路径获取到流返回:
  FileInputStream resultInputStream = new FileInputStream(file) ; //取出目标文件
后来改为:
  FileInputStream is= new FileInputStream(file) ; //取出目标文件
  HttpServletResponse response= ServletActionContext.getResponse();
  FileOutputStream  fos = null;
  try {
   String descFileName =  ServletActionContext
   .getServletContext().getRealPath("/") + "/uploadfiles/" + fileName;
   fos = new FileOutputStream(descFileName);
   byte[] bs=new byte[1024];
   int len=0;
   while((len=is.read(bs))>0){
    fos.write(bs,0,len);
    fos.flush();
   }
   resultInputStream = new FileInputStream(descFileName);
   response.reset();
   File fileSize = new File(descFileName);
   response.setHeader("Content-Length", Long.toString(fileSize.length()));
  } catch (Exception e) {
      return null;
  }   
  return resultInputStream;
也有的人说是没有reset()的原因,但是我不在项目的目录下临时存一个文件作为中介,依然会报该错误,只好这样如此处理。但是不知为何在中间加了一层就不报错了呢?
貌似我对打开流没做关闭处理哦,唉!
本文来自优快云博客,转载请标明出处: http://blog.youkuaiyun.com/foamflower/archive/2009/10/23/4721201.aspx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值