Comet技术
服务器推送技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求。
comet的技术核心就是维护服务器端与客户端的长连接,同时完成服务器端事件到客户端的响应。永久连接建立后,服务器就实时的推送消息过去,需要注意的是,这种推送的内容没有像客户端pull那样有html文件头,所以大大减少了延迟;同时比之于客户端pull,每次都要建立连接,这种长连接的方式省去了连接的时间。
缺点就是,由于维持着长连接,那么服务端的TCP/IP端口一直被占用,于TCP/IP端口数有限的服务器这将是一个严重的问题。
Comet实现方式
基于AJAX长轮询
长轮询是在打开一条链接后继续保持这条链接,直到服务器推过来数据后再关闭。即服务端阻断前一次对客户端的回应,在事件发生后将事件内容绑定在回应中返回给客户端,同时回应结束,此时客户端立即发送第二次请求,服务器阻塞回应等待下一次事件发生。
基于长轮询的服务器推模型:
基于AJAX轮询方式的特点
- 服务器端会阻塞请求,直到有数据传递或者超时
- 客户端 JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接
- 当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,然后一次性的传给客户端
Http长连接的编程原则
1) 不要在同一个客户端开启超过两个的http长连接,这个是受http协议限制的。
2) 控制信息和数据信息使用不同的http连接。
3) 在客户端和服务器端保持“心跳”信息。
iframe流
iframe流方式是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间建立一条长链接,服务器向iframe传输数据。 iframe流方式的优点是浏览器兼容好。
基于iframe流的服务器推模型:
开源框架
- pushlet
- dwr
- cometD
pushlet使用了观察者模型:客户端发送请求,订阅感兴趣的事件;服务器端为每个客户端分配一个会话 ID 作为标记,事件源会把新产生的事件以多播的方式发送到订阅者的事件队列里。