说到Web推送技术,或者IM即时通信技术,因为浏览器各类限制条件,不少状况下咱们借助轮询技术的思想,实际上web推送技术不在少数。html
1.轮询技术(Pull)html5
轮询技术具备更多的优势,其中之一即是兼容性强,有些人把轮询分为定时轮询和长轮询,实际上换汤不换药,轮询就是轮询,改一下调用时机难道就是一种新技术?web
2.基于长链接的Comet技术浏览器
说的长链接技术,听起来很是高大上,但实际上下面的关系就已经基本上是长链接了服务器
客户端请求websocket
Connection:Keep-Alive
服务端返回异步
Connection:Keep-Alive
那么,问题来了,Comet到底作了什么?socket
Comet其实是机制,而不是说的长链接,要否则怎么被称为反向Ajax,这个机制是什么?.net
1.首先咱们确保链接都是Keep-Alive,也就是说服务器和客户端保持Socket链接不关闭,不断开的长链接。code
2.咱们须要把服务器端的Socket Client保存起来,必要的时候调用
3.而后咱们经过服务器端的Socket Client向客户端发送数据
(注意:由于HTTP协议的约定,每次发送的数据必须具备响应头+响应体,不然浏览器没法识别数据)
也就是说,Comet不是长链接技术,而是一种推送技术,但他要维持长链接,基于长链接技术。
可是遗憾的是,不少http请求你根本拿不到Socket Client,好在是Servlet3.0实现了能够将连接Context持有起来的异步通信技术
AsyncContext ac = request.startAsync();
具体用法参考
http://blog.csdn.net/kuyuyingzi/article/details/18843487
3.Server Event技术
Server-Event是HTML5基于事件流的推送技术,这种技术是基于Keep-Alive的轮询技术?说到这里你可能糊涂了,Comet也是基于长链接,为何就是反向Ajax,而这种是轮询呢,其实,Comet自始至终使用的是同一个Socket链接,可是Server-Event可不同,他会产生不少Keep-Alive的链接,可是使用的时候他会从链接池中选择其一,这就是最本质的区别。
用法参考:
http://www.runoob.com/html/html5-serversentevents.html
4.WebSocket技术
WebSocket协议(RFC6455)其实是长链接,这种和Comet比起来可伸缩性比较好,一样也在Servlet 3.0中实现了,具体用法这里不说了,想了解详细信息,请查看以下连接。
http://www.rfc-editor.org/rfc/rfc6455.txt
这里附上WebSocket协议
Client开始handshake
GET / HTTP/1.1 Connection:Upgrade Host:127.0.0.1:8088 Origin:null Sec-WebSocket-Extensions:x-webkit-deflate-frame Sec-WebSocket-Key:puVOuWb7rel6z2AVZBKnfw== Sec-WebSocket-Version:13 Upgrade:websocket
Server 完成handshake
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat
握手成功,即可进行数据交互