HTTP是无状态、单向的协议,用户只能够通过客服端向服务器发送请求并由服务器处理发回一个响应。若要实现聊天室、WEBQQ、、邮箱等这些即时通讯的应用,就要用到服务器推送技术(Comet
传统的AJAX轮询方式,客服端以用户定义的时间间隔去服务器上查询最新的数据。种这种拉取数据的方式需要很短的时间间隔才能保证数据的精确度,但太短的时间间隔客服端会对服务器在短时间内发送出多个请求。
反转AJAX,就是所谓的长轮询或者COMET。服务器与客服端需要保持一条长时间的请求,它使得服务器在有数据时可以返回消息给客户端。
html:
view plaincopy to clipboardprint?
1. <div id="msg"></div> 
2. <input id="btn" type="button" value="测试" /> 
javascript:
这里使用AJAX请求data.php页面获得‘success’的值,请求的时间达到80秒。在这80秒中若没有从服务端返回‘success’则一直保持连接状态,直到有数据返回或‘success’的值为0才关闭连接。在关闭连接后在继续下一次的请求。
view plaincopy to clipboardprint?
1. $(function(){ 
2.  
3.  
4.     $("#btn").bind("click",{btn:$("#btn")},function(evdata){ 
5.          $.ajax({ 
6.                 type:"POST"
7.                 dataType:"json"
8.                 url:"data.php"
9.                 timeout:80000,     //ajax请求超时时间80 
10.                 data:{time:"80"}, //40秒后无论结果服务器都返回数据 
11.                 success:function(data,textStatus){ 
12.                     //从服务器得到数据,显示数据并继续查询 
13.                     if(data.success=="1"){ 
14.                      $("#msg").append("<br>[有数据]"+); 
15.                      evdata.data.btn.click(); 
16.                     } 
17.                  //未从服务器得到数据,继续查询 
18.                     if(data.success=="0"){ 
19.                     $("#msg").append("<br>[无数据]"); 
20.                     evdata.data.btn.click(); 
21.                     } 
22.                 }, 
23.              //Ajax请求超时,继续查询 
24.              error:function(XMLHttpRequest,textStatus,errorThrown){ 
25.                      if(textStatus=="timeout"){ 
26.                          $("#msg").append("<br>[超时]"); 
27.                          evdata.data.btn.click(); 
28.                      } 
29.              } 
30.                  
31.             }); 
32.     }); 
33.      
34. }); 
PHP:
在这里是无限的循环,循环的结束条件就是获取到了返回结果返回Json数据。
并且接受$_POST['time']参数来限制循环的超时时间,避免资源的过度浪费。(浏览器关闭不会发消息给服务器,使用可能一直循环下去)
view plaincopy to clipboardprint?
1. if(empty($_POST['time']))exit(); 
2. set_time_limit(0);//无限请求超时时间 
3. $i=0; 
4. while (true){ 
5.     //sleep(1); 
6.     usleep(500000);//0.5 
7.     $i++; 
8.      
9.     //若得到数据则马上返回数据给客服端,并结束本次请求 
10.     $rand=rand(1,999); 
11.     if($rand<=15){ 
12.         $arr=array('success'=>"1",'name'=>'xiaocai','text'=>$rand); 
13.         echo json_encode($arr); 
14.         exit(); 
15.     } 
16.      
17.     //服务器($_POST['time']*0.5)秒后告诉客服端无数据 
18.     if($i==$_POST['time']){ 
19.         $arr=array('success'=>"0",'name'=>'xiaocai','text'=>$rand); 
20.         echo json_encode($arr); 
21.         exit(); 
22.     } 
23.      
24.
运行效果:在图中可以看到无数据的请求时间达到了40S,在40S的请求中若获得数据则请求关闭。
传统的AJAX轮询方式:
HTTP请求和响应头信息开销总共包括871字节,而且还不包括任何数据,当然,这只是一个例子,你的消息头数据完全可能低于871字节,但我也看到过消息头数据超过2000字节的情况。在这个例子中,股票主题消息数据大约只有20个字符。
 
当你把这样的程序大规模部署给用户时会怎么样?我们使用三个不同的用例观察一下该轮询应用程序关联的HTTP请求和响应头数据需要的网络吞吐量。
用例jquery在线库A1000客户端,每秒轮询一次
网络吞吐量(871x1000=871000字节=6968000比特/秒(6.6Mbps
用例B10000客户端,每秒轮询一次
网络吞吐量(871x10000=8710000字节=69680000比特/秒(66Mbps
用例C100000客户端,每秒轮询一次
网络吞吐量(871x100000=87100000字节=696800000比特/秒(665Mbps

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。