comet技术

Comet是一种用于web的推送技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流。

1) 长轮询:打开一条连接以后保持,等待服务器推送来数据再关闭的方式

2) iframe:页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长链接,服务器向iframe传输数据(通常是HTML,内有负责插入信息的javascript),来实时更新页面

 

 

长轮询long-polling

1)服务器端会阻塞请求直到有数据传递或超时才返回

2)客户端javascript响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接

3)当客户端处理接收的数据、重新建立连接时,服务器端可能会有数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息返回

 

传统的web模式:brower发送http request给服务器端,服务器端在处理数据时,用户一直处于等待状态,数据返回时页面重新加载;是一种请求——等待——请求——等待

Ajax模式:客户端浏览器在运行时首先加载一个Ajax引擎(该引擎由JavaScript编写);Ajax引擎创建一个异步调用的对象,向Web服务器发出一个HTTP请求;服务器端处理请求,并将处理结果以XML的形式返回;Ajax引擎接收返回的结果,并通过JavaScript语句显示在浏览器上,数据在更改时不用重新加载整个页面而只是刷新页面的局部

 

 

注意的地方

1)不要在同一客户端同时使用超过两个的 HTTP 长连接

HTTP 1.1 规范中规定,客户端不应该与服务器端建立超过两个的 HTTP 连接, 新的连接会被阻塞

2)服务器端的性能和可扩展性

 Web 服务器会为每个连接创建一个线程,如果在大型的商业应用中使用 Comet,服务器端需要维护大量并发的长连接;这种应用背景下,服务器端需要考虑负载均衡和集群技术;或是在服务器端为长连接作一些改进

3) 控制信息与数据信息使用不同的 HTTP 连接

使用长连接时,存在一个很常见的场景:客户端网页需要关闭,而服务器端还处在读取数据的堵塞状态,客户端需要及时通知服务器端关闭数据连接。服务器在收到关闭请求后首先要从读取数据的阻塞状态唤醒,然后释放为这个客户端分配的资源,再关闭连接。

因此在设计上,需要使客户端的控制请求和数据请求使用不同的 HTTP 连接,才能使控制请求不会被阻塞。

4) 在客户和服务器之间保持“心跳”信息

服务器端需要确保当客户端不再工作时,释放为这个客户端分配的资源,防止内存泄漏。因此需要一种机制使双方知道大家都在正常运行。

a)  服务器端在阻塞读时会设置一个时限,超时后阻塞读调用会返回,同时发给客户端没有新数据到达的心跳信息。此时如果客户端已经关闭,服务器往通道写数据会出现异常,服务器端就会及时释放为这个客户端分配的资源。

b)  如果客户端使用的是基于 AJAX 的长轮询方式;服务器端返回数据、关闭连接后,经过某个时限没有收到客户端的再次请求,会认为客户端不能正常工作,会释放为这个客户端分配、维护的资源。

c)  服务器处理信息出现异常情况,需要发送错误信息通知客户端,同时释放资源、关闭连接。

 

HTTP 长连接用于实际应用,要考虑的细节还是很多的…

Pushlet 是一个开源的 Comet框架,在设计上有很多值得借鉴的地方,对于开发轻量级的 Comet 应用很有参考价值(自己还没了解过,有兴趣的筒子看一下吧)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值