Comet


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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值