Ajax是一种从页面向服务器请求数据的技术,Comet则是一种服务器向页面推送数据的技术,它能够让信息近乎实时地被推送到页面上。

  有两种实现Comet的方式:长轮询和流。

  长轮询是浏览器定时向服务器发送请求,然后服务器一直保持连接打开,直到有数据可发送。发送完数据后,浏览器关闭连接,随即发起一个新的请求。

SSE与WebSocket

  短轮询与长轮询的区别是,服务器接收到请求后,是否立即发送响应。短轮询是服务器会立即发送响应,无论数据是否有效。而长轮询是等待发送响应。所有浏览器都支持轮询,使用xhr对象和setTimeOut()就能实现。

   HTTP流,浏览器向服务器发送一个请求,而服务器保持连接打开,然后周期性地向浏览器发送数据。

  在Firefox\Safari\Opera\Chrome中,通过侦听readystatechange事件及检测readyState属性的值是否为3,就可以实现HTTP流。当readyState值变为3时,responseText属性中就会保存就收到的所有数据,此时,就需要比较此前接收到的数据,决定从什么位置开始取得最新的数据。代码如下:

 1 function createStreamingClient(url,progress,finished){
 2     var xhr = new XMLHttpRequest(),received = 0;
 3     xhr.open("get",url,true);
 4     xhr.onreadystatechange = function(){
 5         var result;
 6         if(xhr.readyState == 3){
 7             result = xhr.responseText.substring(received);
 8             received += result.length;
 9             
10             progress(result);
11             
12         }else if(xhr.readyState == 4){
13             finished(xhr.responseText);
14         }
15         
16     };
17     xhr.send(null);
18 
19     return xhr;    
20 }
21 
22 var client = createStreamingClient("streaming.php",function(data){
23                 alert("received:"+data);
24             },function(data){
25                 alert("done!");
26             });
View Code

相关文章: