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