Comet

来源:互联网 发布:qq显示当前网络不可用 编辑:程序博客网 时间:2024/05/18 03:07


1、概念

Comet 是一种更高级的Ajax技术,经常被叫做服务器推送。Ajax 是 一种从页面向服务器请求数据的技术,而comit 则是一种服务器向页面推送的技能。

Comet 能够让信息几乎实时地推送到页面上,非常适合处理体育比赛的分数和股票报价。

2、浏览器实现

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

(1)轮询:分为长轮询和短轮询。

长轮询:页面发送一个请求,然后服务器一直保持打开,直到有数据可发送。发送完数据之后,浏览器关闭连接,随即又发送一个到服务器的请求。

这一过程在页面打开期间一直持续不断。

短轮询:浏览器定时向服务器发送请求,看有没有更新数据。

无论是短轮询还是长轮询,浏览器都要在接收数据之前,先发起对服务器的连接。两者最大的区别在于服务器如何发送数据。

短轮询是服务器立即发送响应,无论数据是否有效,而长轮询数等待发送响应。轮询的优势是所有浏览器都支持,因为使用

XHR 对象 和setTimeOut() 就能实现。

(2)流

流不同于上述轮询策略,因为它在页面的整个生命周期内只使用一个HTTP 连接。具体来说,就是浏览器向服务器发送一个请求,

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

3、例子

function createStreamingClient(url, process, finished){    var xhr = new XMLHttpRequest(),        received = 0;        xhr.open('get',url,true);    /*      在浏览器中,随着不断从服务器接收数据,readyState 的值会周期性地变为3。      当readystate值为3时,responseText 属性就会保存接收到的所有数据。     */    xhr.onreadystatechange = function(){      var result;      if(xhr.readyState == 3){        //只取得最新数据并调整计数器        result = xhr.responseText.substring(received);        received += result.length;                //调用process 函数        process(received);      }else if(xhr.readyState == 4){        finished(xhr.responseText);      }    };        xhr.send(null);    return xhr;  }  var client = createStreamingClient('streaming.php',          function(data){            alert('Received : ' + data);          },function(data){            alert('done!');          });

4、 SSE 

SSE(Server-Sent Events,服务器发送事件)是围绕只读Comet 交互推出的API 或者模式。SSE API 用于创建到服务器的单向连接,

服务器通过这个连接可以发送任意数量的数据。服务器响应的MIME类型是 text/event-stream ,而且浏览器中的Javascript API 能解析

格式输出。SSE 支持短轮询,长轮询和HTTP流,而且能在断开连接时自动确定可是重新连接。

//传入的url 必须与创建对象的url 同源  var source = new EventSource('myevents.php');  source.onmessage = function(event){    var data = event.data;    //处理数据  };  /*    EventSource 对象会保存与服务器的活动连接。如果保持断开,就会重新连接。     这意味着SSE 适合长轮询和HTTP流。     强制断开,调用 close() 方法。   */  source.close();    /*    其他 API :    open:在建立连接时触发    message: 在服务器接收到新事件时触发    error:在无法建立连接时触发   */

5、Web Sockets 

Web Sockets的目标是在一个单独持久连接上提供全双工、双向通信。在JavaScript中创建了 web socket 之后,会有一个http请求发送到浏览器以发起连接。

在取得服务器响应后,建立的连接会使用HTTP 升级从HTTP协议交换为 Web Socket 协议。也就是说,使用标准的HTTP服务器无法实现 Web Sockets,

只有专门支持这种协议的浏览器才能工作。

由于Web Sockets 使用了自定义的协议,所以URL模式也略有不同。未加密的连接不在是 http://,而是 ws://;

加密的连接也不是 https://,而是 wss://。在使用Web Socket URL 时,必须带着这个模式,因为将来还有可能支持其他模式。

使用自定义协议而非 HTTP 协议的好处是,能够在客户端和服务器端之间发送少量的数据,而不必担心HTTP那样字节级的开销。由于传递的数据包很小,

因此 Web Sockets 非常适合移动应用。


详细博文参考:http://www.oseye.net/user/kevin/blog/78

0 0