1. 我用js写了个轮询,再怎么写可以让它在条件下停止啊,高手来帮帮啊
用clearInterval,如下
$(document).ready(function(){
c = setInterval(checkIsExist,10000);//每10秒执行一次checkIsExist方法
});
function checkIsExist(){
$.ajax({
type: "POST",
url: "/SecondServlet",
data: "date="+new Date(),
success: function(rtmsg){
if(rtmsg == 'exist'){
$("#download").html("<button onclick=\"window.open('/ArticleServlet');\">;下载</button>");
window.clearInterval(c);
}
}
});
}
2. 长连接与长轮询分别如何实现的
comet有两种形式 长轮询和长连接 长连接的话: 服务端Servlet不close response,循环查找是否有数据是否要推送到客户端 客户端连接到客户端之后,单独有线程接收Servlet推送的数据,实现异步接收,可以用jquery实现,或者自己写javascript也可以 使用XMLHTTP 方式如下:try{XMLHttpReq_get = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {try{XMLHttpReq_get = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e){try{XMLHttpReq_get = new XMLHttpRequest(); } catch(e) { XMLHttpReq_get = false; alert("不能创建XMLHttpRequest对象"); return false;}}}XMLHttpReq_get.onreadystatechange = processRequest;// servlet推送数据的时候,客户端触发processRequest这个方法 XMLHttpReq_get.open("这个地方写methode名称,Get or Post", "Servlet URI", true); XMLHttpReq_get.send(null); //建立连接 function processRequest(){ if(XMLHttpReq_get.readyState == 4){//判断对象状态 这个表示长连接断了 服务端的response被close 或者servlet处理线程结束 if(XMLHttpReq_get.status == 200){//信息已经成功返回,开始处理信息// TODO} else {//页面不正常 alert("您所请求的页面有异常");}}if(XMLHttpReq_get.readyState == 3){//判断对象状态 有数据传回,连接没断,servlet flush数据回来 if(XMLHttpReq_get.status == 200){// TODO} else {//页面不正常 alert("您所请求的页面有异常");}}} 以前是我做的一个聊天室的部分代码(有修改) 留了大致一个逻辑给你看看 有ajax的话 可以不这么做。
3. ajax长轮询
一般最原始的作法就是在客户端搞个定时器一直向后台请求,而ajax的长轮询与一般的http连接不一样,它发送的是长连接,比如说你发过去一个连接,它并不急于给你返回过来请求,而是等到后台有动作的时候才有相应,这样就减少了客户端的压力,现在很多地方都用到这种技术,比如说百度,新浪微博,比较成熟的框架有pushlet,另外servlet3.0也增加了异步的功能,也能很好的解决这个问题,HTML5在将来,这个问题就更简单了!如果你要研究,建议你深入的了解一下HTTP协议的内部工作原理,了解一下服务器的实现,希望能帮到你。