1. WebSocket概念
WebSocket是HTML5开始提供的一种Client与Server间进行全双工(full-duplex)通讯的网络技术
双工(duplex),指二台通讯设备之间,允许有双向的资料传输
Client和Server通过WebSocket Protocol建立连接后,双方可以互传数据并且双方都可以关闭此连接
2. HTTP概念
HTTP Protocol是无状态协议的,Client和Server通过HTTP Protocol建立连接后,将采用”request—response”模式通信
2.1 Client发起请求
2.2 Server接收请求
2.3 经过三次握手,建立连接
2.4 Server处理请求
2.5 Server将结果发给Client
2.6 断开连接
3. 既然使用HTTP时,Server不会主动向Client发送消息,那么Client如何获取Server的最新消息呢(刷新浏览器除外)?
常用的方法有:AJAX轮询、AJAX长轮询、HTML5 Server Sent Events (SSE) / EventSource
(下面的图片源自此文:http://*.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet?lq=1)
3.1 AJAX轮询
function doAjaxPolling(){ $.ajax({ url: "http://xxx", timeout: 1000*60, success: function(data){ //data就是从Server获取的消息 }, complete: function(){ setTimeout(doAjaxPolling(),10*1000); }, error: function(){ setTimeout(doAjaxPolling(),10*1000); } }); }
Client每隔一段时间(如:10s)向Server发送一次请求
3.2 AJAX长轮询
function doAjaxLongPolling(){ $.ajax({ url: "http://xxx", timeout: 1000*60, success: function(data){ //data就是从Server获取的消息 }, complete: function(){ doAjaxLongPolling(); }, error: function(){ doAjaxLongPolling(); } }); }
Client向Server发送一次请求,这时Server并未及时处理该请求,而是等到Server端产生新消息才处理该请求,然后将结果发给Client,Client收到消息后,会重新向Server发送一次请求
如果在规定时间内,Server仍未返回消息,Client会断开此次连接,然后重新向Server发送一次请求
3.3 HTML5 Server Sent Events (SSE) / EventSource
var source = new EventSource("http://xxx"); source.onmessage = function(event) { //event.data就是从Server获取的消息 };
Server Sent Events跟AJAX轮询类似,只不过轮询时间为3s
4. 使用WebSocket获取Server新消息
使用HTTP时,消息总是单项传输,而使用WebSocket时,Client和Server建立连接后,可以双向传输消息,当Server有新消息时,可以直接发给Client
5. WebSocket与HTTP keep-alive
HTTP keep-alive(HTTP 持久连接)是使用同一个TCP连接来发送和接收多个HTTP request/response,而不是为每一个新的request/response打开新的连接的方法
在 HTTP 1.1 中,所有的连接默认都是持续连接,除非特殊声明不支持
Chrome的keep-alive值为300s
Tomcat可在server.xml的Conenctor标签中设置keepAliveTimeout属性。默认情况下,keepAliveTimeout=connectionTimeout,即20s。keepAliveTimeout设置为-1,则连接永久有效
HTTP keep-alive,虽然也保存了连接,但仍是request—response模式,Server不能主动向Client发送消息
6. WebSocket的demo
打开http://www.websocket.org/echo.html,可看到当前浏览器是否支持WebSocket。如果支持,点击”Connect”,连接成功后,点”Send”即可发送消息
该页面下方,有个创建WebSocket的例子
7. WebSocket API
http://dev.w3.org/html5/websockets/
总结下WebSocket的特点:
Client和Server之间的连接可以一直使用,直到某一方关闭连接;避免了频繁建立、断开连接所产生的CPU、内存开销;Client和Server之间可以双向传输消息
参考文章:
http://zh.wikipedia.org/wiki/WebSocket
http://zh.wikipedia.org/wiki/%E5%85%A8%E9%9B%99%E5%B7%A5
http://zh.wikipedia.org/wiki/HTTP%E6%8C%81%E4%B9%85%E8%BF%9E%E6%8E%A5
http://gabenell.blogspot.hk/2010/11/connection-keep-alive-timeouts-for.html
http://*.com/questions/10028770/html5-websocket-vs-long-polling-vs-ajax-vs-webrtc