说到Web推送技术,或者IM即时通讯技术,由于浏览器各种限制条件,很多情况下我们借助轮询技术的思想,实际上web推送技术不在少数。
1.轮询技术(Pull)
轮询技术具有更多的优点,其中之一便是兼容性强,有些人把轮询分为定时轮询和长轮询,实际上换汤不换药,轮询就是轮询,改一下调用时机难道就是一种新技术?
2.基于长连接的Comet技术
说的长连接技术,听起来非常高大上,但实际上下面的关系就已经基本上是长连接了
客户端请求
Connection:Keep-Alive
服务端返回
Connection:Keep-Alive
那么,问题来了,Comet到底做了什么?
Comet实际上是机制,而不是说的长连接,要不然怎么被称为反向Ajax,这个机制是什么?
1.首先我们确保连接都是Keep-Alive,也就是说服务器和客户端保持Socket连接不关闭,不断开的长连接。
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
握手成功,便可进行数据交互