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

Comet(Http长连接) 基于php的服务器推送实例,演示在个客户端之间传递数据! 立即下载


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。

http长轮询技术comet的实现 通过comet实现了一个聊天功能。 1.需要在tomcat的server.xml里面配置 2.需要在tomcat的context.xml里面配置 在Context标签里面配置: 立即下载

相关推荐

matlab kwave模拟超声换能器学习笔记

kwave模拟超声换能器的学习笔记,从零开始造车轮

SolvingMaster的博客 3197

有限元缺陷:剪切锁死

有限元缺陷:剪切锁死

wsxww11的博客 5186

HTTP、WebSocket和Socket.IO

Socket.IO 是一个封装了 Websocket、基于 Node 的 JavaScript 框架,包含 client 的 JavaScript 和 server 的 Node。其屏蔽了所有底层细节,让顶层调用非常简单。另外,Socket.IO 还有一个非常重要的好处。其不仅支持 WebSocket,还支持许多种轮询机制以及其他实时通信方式,并封装了通用的接口。

weixin_54792212的博客 1666

FA 新增资产API Demo

DECLARE l_trans_rec fa_api_types.trans_rec_type; l_dist_trans_rec fa_api_types.trans_rec_type; l_asset_hdr_rec fa_api_types.asset_hdr_rec_type; l_asset_desc_rec fa_a

chosen1brain的专栏 2142

Qt实现仿微信在线聊天工具(服务器、客户端)V1_ 01

在主控类中绑定登录类的信号 void signalLoginOK() ,跳过验证步骤,先实现页面的跳转MyChatToolClient.h文件//登录成功槽函数 private :MyChatToolClient.cpp文件} //登录成功槽函数 void MyChatToolClient :: slotLoginOk() {//关闭登录窗口并释放空间 m_loginWin -> close();//新建并打开聊天窗口 m_chatWin = new ChatWindow;

Leo的博客 1870

HTTP 长连接 Comet

长连接方式:以前一直局限在http长轮询阻塞、activex控件、flash控件、javaapplet 、websocket 考虑。 最近看到淘宝 增量订单同步的webapi(http://open.taobao.com/doc/detail.htm?id=1029)才有了想法,想进一步了解此http长连接是如何实现,果然别有洞天。 目前此方式主要用于:web实时推送 、web桌面、twit...

iteye_4979的博客 446

为分析表明卡诺电池技术(或热泵式储电技术)-是目前最佳的储能技术!!!-2021年

卡诺电池(Carnot Battery)是一种基于热力学循环的储能技术,其核心原理是通过热力循环将电能转化为热能存储,并在需要时将热能重新转换为电能输出。这种技术得名于热力学中的卡诺循环原理,由法国工程师卡诺于1824年提出。

qq_15963745的博客 655

电商系统系统笔记之Http,comet,WebSocket

Http协议的特点1.单工通信,服务器无法推送信息给客户端2.请求-应答模式3 无状态由于以上的http特点,传统模式的 Web 系统以客户端发出请求、服务器端响应的方式工作。这种方式并不能满足很多现实应用的需求,譬如:监控系统:后台硬件热插拔、LED、温度、电压发生变化;即时通信系统:其它用户登录、发送信息;即时报价系统:后台数据库内容发生变化;这些应用都需要服务器能实时地将更新的信息传送到客户...

Just Do It! 846

史上最全!研究生科研必备科研工具(含AI科研工具),附使用说明和示例

这些工具在科研中的应用非常广泛,可以帮助研究生更高效地完成研究任务。为了更好地利用这些工具,建议深入学习它们的官方文档和教程,或者参加相关的工作坊和培训。

智能AI让学术科研更容易 3941

论文阅读:arixv 2025 Poisoning Attacks on LLMs Require a Near-constant Number of Poison Samples

研究者做了目前最大规模的“投毒实验”,训练了从6亿参数到130亿参数的模型(覆盖了中小到大型LLM),用的训练数据量也是“最适合模型大小”的(按行业里的“Chinchilla法则”,模型越大,训练数据量也按比例增加)。总结下来就是:这篇论文告诉我们,给大语言模型投毒,比之前想的容易得多——不需要海量毒数据,只要几百条藏好后门的文档,就能让大模型“带毒工作”,而且平时还看不出来。——这比之前大家担心的“需要投毒数据占训练集一定比例”要可怕得多,因为对大模型来说,“固定数量”的毒数据更容易偷偷塞进去。

CSPhD-winston的博客 1080

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

 很多应用譬如监控、即时通信、即时报价系统都需要将后台发生的变化实时传送到客户端而无须客户端不停地刷新、发送请求。本文首先介绍、比较了常用的“服务器推”方案,着重介绍了 Comet - 使用 HTTP 长连接、无须浏览器安装插件的两种“服务器推”方案:基于 AJAX 的长轮询方式;基于 iframe 及 htmlfile 的流方式。最后分析了开发 Comet 应用需要注意的一些问题,以及如何借助开源的 Comet 框架-pushlet 构建自己的“服务器推”应用。请访问 Ajax 技术资源中心,这是有关 A

李飞勃的专栏 7564

2026终极反反爬:Canvas/WebGL/字体指纹全维度伪装,应对浏览器检测实战指南

本文分享了2026年浏览器指纹检测现状及全维度伪装方案。当前反爬系统采用多维度联合指纹检测,重点针对硬件级(WebGL、Canvas)、系统级(字体、CPU)和行为级(鼠标移动)指纹。作者设计了一个独立的指纹伪装引擎,包含真实设备指纹库、指纹生成器和统一注入层,通过JS沙箱隔离实现伪装。核心方案包括:Canvas指纹通过真实设备渲染差异添加微偏移;WebGL指纹完整劫持上下文返回真实显卡参数;字体指纹劫持measureText方法模拟不同系统字体宽度。该方案实测可连续运行一个月零封号,解决了传统方法易被检测

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 924

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

一、背景        在做某类程序应用时,需要将服务器的响应自动的反馈给浏览器,而不是采用用户请求的方式。基于这样的应用还是比较多的,比如说网页聊天、实时消息提醒等等。所以我们需要这样一种技术来实现服务器主动的将信息推送到浏览器 二、解决方案思考        1、定时请求。定义一个timer,浏览器每隔一段时间去请求服务器,然后配合ajax将结果显示到客户浏览器上。

jeff's blog 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

  转自:http://www.ibm.com/developerworks/cn/web/wa-lo-comet/   很多应用譬如监控、即时通信、即时报价系统都需要将后台发生的变化实时传送到客户端而无须客户端不停地刷新、发送请求。本文首先介绍、比较了常用的“服务器推”方案,着重介绍了 Comet - 使用 HTTP 长连接、无须浏览器安装插件的两种“服务器推”方案:基于 AJAX ...

dekai6197的博客 157

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: 2012-01-12 18:19 js通过as完成socket通信
下一篇: 如何让jsp和js获取来源页地址和ip原理及代码
goodlad
博客等级 码龄22年 2粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值