Comet工作原理

来源:互联网 发布:淘宝店铺 武汉飞鱼运动 编辑:程序博客网 时间:2024/06/06 11:47

1.概念
Comet是通用术语,描述协议和为浏览器提供可行且可拓展的低延迟数据传输实现的集合。目标包括随时从服务端向客户端推送数据,提升传统ajax的速度和可拓展性。
2.工作原理
Comet通过更智能的长连接管理和减少每个连接的服务器资源,Comet相对于传统web服务,,更易于提供更多的同步连接,客户端与服务器之间数据传输更快。相对于客户端,采用的技术有轮询,长轮询,永久帧,XHR流和websocket.

  • 轮询:网站每x毫秒发出一个请求来检查是否有更新需要呈现在用户页面上。
setTimeout(function(){xhrRequest({"foo":"bar"})},2000);function xhrRequest(data){   var xhr = new XMLHttpRequest();   xhr.open("get","foo.php",true);   xhr.onreadyStatechange=function(){     if(xhr.readyState == 4){     //处理服务器返回的更新     }   }}
  • 长轮询
    即浏览器发送一个请求到服务器,而服务器在有可用的新数据时才响应。服务端要保持一个所有未响应请求和它们对应连接的大集合。服务端通过返回Transfer-Encoding:chuncked
    基本长轮询例子:
    function longPoll(url,callback){    var xhr=new XMLHttpRequest();    xhr.onreadystatechange=function(){       if(xhr.status==4){          //发送另一个请求,重新连接服务器          callback(xhr.responseText);          xhr.open('GET',url,true);          xhr.send(null);      }     }     //连接到服务器以打开一个请求     xhr.open('post',url,true);     xhr.send(null);   }
  • 永久帧
    方法是打开一个隐藏的iframe,请求一个基于HTTP1.1块编码的文档。
    function foreverFrame(url,callback){      var iframe = body.appendChild(document.createElement("iframe"));      iframe.style.display="none";      iframe.src=url+"?callback=parent.foreverFrame.callback";      this.callback = callback;    }
  • XHR流
    xhr流是通过一个标准的XMLHttpRequest获得的,但能够在onreadystatechange事件中readyState为3时去访问服务器发送的数据(在响应完成之前),这样即无需等待连接关闭就可以操作数据。但IE不支持该方法。
    Comet通信的连接只允许服务器向客户端推送消息,没有达到双向连接。