AJAX读取数据出现Connection reset by peer: socket write error的问题如何解决????

arron_java 2007-08-08 05:08:48
大家好,本人在开发首页的地图导航显示数据时,遇到一些关于 Exception Processing ErrorPage[errorCode=404, location=/building.jsp]
ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error的问题。
本功能大概是:在鼠标移动到某个城市时,将显示一个从数据库读取的城市生产总额和项目数等信息。
本人用了AJAX进行异步交互读取数据来显示。虽然能成功显示,但是在ECLIPSE的窗口总是会出现错误如上所示,经上网查后发现是可能自己在客户端做测试时用鼠标移动到下个城市太快的缘故吧,导致客户端不停刷新,造成无用的进程,虽然数据能正常显示,但我想请教各位高手有什么好的解决方案使后台不会有Connection reset by peer: socket write error提示出现,谢谢!

以下是我写的一些代码:
index.jsp:
//执行请求发送
function send_request(url,strsearchoose) {
if (url != "") {
// 获取一个XMLHttpRequest实例
var req = newXMLHttpRequest();
//alert(req);
// 设置用来 从请求对象 接收回调通知 的句柄函数
var handlerFunction = processRequest(req,strsearchoose);
req.onreadystatechange = handlerFunction;
// 打开一个联接到XXXservlet的HTTP POST联接
// 第三个参数表示请求是异步的
req.open("GET", url, true);
// 指示请求体包含form数据
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
req.send(null);
} else {
alert("");
}
}
/*初始化对象并发出XMLHttpRequest请求*/
function newXMLHttpRequest() {
var xmlreq = false;
if (window.XMLHttpRequest) {
// 在非Microsoft浏览器中创建XMLHttpRequest对象
xmlreq = new XMLHttpRequest();
} else {
if (window.ActiveXObject) {
//通过MS ActiveX创建XMLHttpRequest
try {
// 尝试按新版InternetExplorer方法创建
xmlreq = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e1) {
// 创建请求的ActiveX对象失败
try {
// 尝试按老版InternetExplorer方法创建
xmlreq = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e2) {
// 不能通过ActiveX创建XMLHttpRequest
}
}
}
}
return xmlreq;
}
function processRequest(req,strsearchoose) {
return function () {
// 如果请求的状态是“完成”
if (req.readyState == 4) {
// 检查是否成功接收了服务器响应
if (req.status == 200) {
// 将载有响应信息的XML传递到处理函数
//responseXmlHandler(req.responseXML);
//将传回的信息当字符串使用
if(strsearchoose=="0"){
document.getElementById("report").innerHTML = req.responseText;
//alert(req);
}else{
document.getElementById("projectlist").innerHTML = req.responseText;
}
} else {
// 有HTTP问题发生
alert("" + req.status);
return false;
}
}
};
}

function showreport(id,name){//使用此方法来调用AJAX框架进行发送请求
var strid=id;
var strname=name;
var stryear=document.getElementById("year").value;
var strmonth=document.getElementById("month").value;
var strsearchoose=0;
//alert(strid+"--"+name+"--"+stryear+"--"+strmonth);
var url="ajaxsearch.jsp?searchoose="+strsearchoose+"&statareaid="+strid+"&statareaname="+escape(encodeURI(strname))+"&year="+stryear+"&month="+strmonth;
//alert(url);
send_request(url,strsearchoose);//调用上面的请求方法
}
ajaxsearch.jsp:
<%
String strReportHtml = ""; //生成的数据显示内容
String strsearchoose=request.getParameter("searchoose");
if(strsearchoose.equals("0")){
//列如:省id:001001001001 : 广东省 城市id:001001001001001 : 广州市
String strOrganiseNo = request.getParameter("statareaid");
if (strOrganiseNo == null || (strOrganiseNo + "A").equals("A")) {//判断传递过来的统计地区编号是否存在
out
.println("index.jsp文件的参数传递错误! statareaid ,请与管理员联系!");
return;
}
//列如:地名:广州市 地区名:天河区
String strOrganiseName = request.getParameter("statareaname"); //统计的地区名称
strOrganiseName = (strOrganiseName == null) ? ""
: strOrganiseName;
try {
if (!strOrganiseName.equals("")) {
strOrganiseName = JavaScriptEncode
.unescape(strOrganiseName);
strOrganiseName = new String(strOrganiseName
.getBytes("ISO-8859-1"), "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
}
//列如:时间:获取首页的时间
String strYear = request.getParameter("year");
String strMonth = request.getParameter("month");
String strDate=strYear+"年 1~"+strMonth+"月";

//组合成查询条件for rstrCondition
String strCondition = ""; //统计条件
if(strMonth=="12"){
strCondition = "where 1=1 and organiseno like '"+strOrganiseNo+"%' and printdate>=to_date('"+strYear+"-01-01','yyyy-mm-dd') and printdate<=to_date('"+strYear+"-12-30','yyyy-mm-dd')";
}else{
strCondition = "where 1=1 and organiseno like '"+strOrganiseNo+"%' and printdate>=to_date('"+strYear+"-01-01','yyyy-mm-dd') and printdate<=to_date('"+strYear+"-"+strMonth+"-30','yyyy-mm-dd')";
}
String strStatisType = "0";//0:表示按原始备案统计
strCondition = strCondition + " and RecordSign = '"+ strStatisType + "' "; //是按原始备案统计还是按变更后统计

ReportConf rc = new ReportConf();
strReportHtml = rc.getReportajax(strCondition, strOrganiseNo, strOrganiseName,strDate);
/* getReportajax方法把条件进行组合成SQL语句,调用executeQuery方法进行查询返回组合成HTML的数据表格(里面包括了城市的生产总额和项目数等信息)
*/
out.println(strReportHtml);
}%>
...全文
2015 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
午夜咖啡男 2009-01-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 foamflower 的回复:]
我遇到和海日楞一样的问题,
如果点击“保存”后再点“保存”或“打开”则不会报:信息: ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error
如果点击“取消”或点击“保存”按钮后再点“取消”就会报该信息。
我的文件下载是调用Struts中的ACTION里的方法,是先把文件写入到流中的方法。请问这有没有问题?

[/Quote]

你使用输出流输出的时候肯定是在try..catch的结构里的阿,catch到这个异常处理就好了阿
foamflower 2009-01-15
  • 打赏
  • 举报
回复
我遇到和海日楞一样的问题,
如果点击“保存”后再点“保存”或“打开”则不会报:信息: ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error
如果点击“取消”或点击“保存”按钮后再点“取消”就会报该信息。
我的文件下载是调用Struts中的ACTION里的方法,是先把文件写入到流中的方法。请问这有没有问题?
liu_yinpeng 2008-01-08
  • 打赏
  • 举报
回复
参考arron_java的解释,我遇到如下问题


我在页面没有用Ajax,只是普通的从服务器下载文件,也遇到了同样的问题.Spring+struts,将Action的代理由Spring创建.并从Action对象中获得流对象将文件输出.
客户端如果点击下载,弹出是否保存对话框,如果点击确定就没有以上的问题了,如果点击取消就会报:ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error

我想是不是在用户点击下载但是还没有确定保存的时候,文件就已经被写入到流中......

请各位高手指点...
lemonfamily 2007-08-14
  • 打赏
  • 举报
回复
代码没怎么看,以前我曾经写过一篇同步的ajax方法,不过被我删了~。但从你担心的问题来说,解决起来其实并不难,你只要在接收到响应时再检查是否有必要再创建xmlhttprequest对象,而不是鼠标移动时就去创建。另外,如果你使用的是ie,需要在接收完数据后,要清空xmlhttp,要不然你这种频繁的创建操作会让客户端运行越来越慢。
arron_java 2007-08-09
  • 打赏
  • 举报
回复
我自己上网查得当客户端发出请求(request)后,如果还没有完全获得服务端的响应(response),客户端与服务器段的连接断开(例如断网、按了“停止”按钮、或者客户端浏览器关闭等),服务器端就会抛出此Exception。我想应该是我在做导航时,鼠标移动太快,到每个城市时间很短,导致客户端在短时间内多次REQUEST而造成的,我想问问AJAX有没有能判断第一个发出请求到服务器响应完毕后才能让第二请求执行的方法?能不能给个具体点的例子谢谢!!
arron_java 2007-08-09
  • 打赏
  • 举报
回复
怎么没人给意见的啊?请熟悉AJAX编程的人给点意见,谢谢拉!
zhulei2008 2007-08-08
  • 打赏
  • 举报
回复
顶下

52,797

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ajax
社区管理员
  • Ajax
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧