Comet:基于HTTP长连接的“服务器推”技术


1、基础知识

HTTP流的概念

持久HTTP流只是一种是HTTP链接保持打开状态的简单方法,这样大量的HTTP请求不需要进行打开和关闭操作就可以被一个一个地发送。

常用PHP函数
  1. sleep(10);  //暂停 10 秒   
  2. ob_flush();  
  3. flush();      

PHP向浏览器周期性发送数据的功能,并不是所有服务器都可行,更多相关信息请参阅www.php.net/flush。关于flush的内容,请参考深入理解ob_flush和flush的区别

<script>标签的执行时间

在绝大多数浏览器中,当还没有读取到</script>结束标签时,代码是不会执行的。

配置脚本最大执行时间

在Comet执行时,经常超过了php脚本的最大执行时间,因此需要配置maxexecutiontime(详细参考:PHP - PHP.ini配置中文解释),并结合心跳机制。

  1. var iTimer;  
  2. function heartbeat() {  
  3.     clearTimeout(iTimer);  
  4.     iTimer = setTimeout(function(){  
  5.         // 执行一次Comet  
  6.         // 300为服务器端配置的max_execution_time  
  7.     }, 300);      
  8. }  

2、Comet的实现方法

IE浏览器

demo.html

  1. <script type="text/javascript">  
  2.     var oPage = new ActiveXObject("htmlfile");  
  3.     oPage.open();  
  4.     oPage.write("<html><body></body></html>");  
  5.     oPage.close();  
  6.     oPage.body.innerHTML = '<iframe src="connection.php"></iframe>';          
  7.     oPage.parentWindow._parent = self;  
  8.   
  9.     function heartbeat() {}  
  10.     function modifiedAt() {}  
  11. </script>  
  • oPage.parentWindow访问的是HTMLFile对象的window属性
  • connection.php中JS使用top或parent访问的不是demo.html的window属性
  • connection.php中JS使用top或parent访问HTMLFile对象的window属性

connection.php

  1. <html>  
  2. <head></head>  
  3. <body>  
  4. <script type="text/javascript">  
  5.     parent._parent.heartbeat();  
  6.     parent._parent.modifiedAt();  
  7. </script>  
  8. </body>  
  9. </html>  
其他浏览器

demo.html

  1. var oXHR = new XMLHttpRequest();  
  2. oXHR.open('get''connection.php'true);  
  3. oXHR.readystatechange = function() {  
  4.     switch (oXHR.readyState) {  
  5.         case 3:  
  6.             alert(oXHR.responseText);  
  7.             break;  
  8.         case 4:  
  9.             alert('done');  
  10.     }  
  11. };  
  • 每次从服务器收到数据时(即服务器端调用“ob_flush(); flush();”时),都会触发readyStatechange事件。
  • readyState等于3时,oXHR.responseText返回的内容,不是本次变化新增的内容,而是之前接受到的内容+本次变化新增的内容。

3、LiveConnect的HTTP流

LiveConnect是Firefox、Safari和Opera支持的一种未充分利用的技术,通过它可以再JavaScript种使用Java对象,但客户机必须安装JRE,并且浏览器必须启用Java。

4、服务器端发送的Dom事件

示例

demo.html

  1. <body>  
  2.     <event-source id="iBox" src="connection.php" />  
  3.     <script type="text/javascript">  
  4.         var iBox = document.getElementById('iBox');  
  5.         iBox.addEventListener('modified', function(oEvent){  
  6.             console.log(oEvent);  
  7.         });  
  8.     </script>  
  9. </body>  

connection.php

  1. <?php  
  2.     header("Content-type:application/x-dom-event-stream");  
  3.     while (true) {  
  4.         echo 'Event: modified';  
  5.         echo 'data: 5:23:06';         
  6.         ob_flush();  
  7.         flush();  
  8.         sleep(1);  
  9.     }  
  10. ?>  
  • 使用的就是一个保持打开的链接
  • Event后面是事件名称,其余的是event对象的属性;每两个事件之间使用一个空白换行区分。
  • Target后面紧跟触发的元素,格式类似于CSS选择器。 * 疑问之处,服务器端事件处理函数会不会触发浏览器的默认事件,即想<input type="submit"/>发送click事件,会不会提交表单,还是仅调用该元素的click绑定函数?
  • 服务器端发送的Dom事件可以触发自定义事件,上例中的”modified”事件就是自定义事件。还可以触发客户端的UI事件,Dom Level 3事件规范中命名的所有事件都能够通过服务器端的Dom事件来触发。
  • 不一定要为元素绑定事件处理函数,每个事件都将自动传给目标元素,并由钙元素的事件处理函数负责处理,如下例。

返回内容

  1. Event: click  
  2. Target: #iBox  
  3. button: 2  
  4. screenX: 0  
  5. screenY: 0  
  6. Event: click  
  7. Target: Document  
  8. data: See you later!  
支持性

到2006年10月为止,Opera9.0.1是唯一支持服务器端发送的Dom事件的浏览器,经测试Opera 11.52不支持。

5、连接管理

HTTP1.1协议中规定,一个客户端最多允许同时保持两个连接(这点取决于浏览器,迅雷等下载工具也会提高这个并发的数目)。使用Comet的后果就是会占用一个连接,具体的解决办法是为Comet指定专门的子域名。

Comet也会增加服务器的并发数目,所以在使用Comet技术之前要与维护服务器的人员交流,确保他们理解所要实现的功能,并给与支持。

Comet技术早在2007年左右就有人提出,最早的一篇文章是What else is burried down in the depth’s of Google’s amazing JavaScript?,至今仍未大面积使用。主要原因还在于它对服务器的开销和开发模式上的改变,另一方面使用Ajax绝大多数情况下可以很好的替代Comet。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值