初识html5 WebSocket

1.  WebSocket概念

WebSocketHTML5开始提供的一种ClientServer间进行全双工(full-duplex)通讯的网络技术

双工(duplex),指二台通讯设备之间,允许有双向的资料传输

ClientServer通过WebSocket Protocol建立连接后,双方可以互传数据并且双方都可以关闭此连接

2. HTTP概念

HTTP Protocol是无状态协议的,ClientServer通过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://stackoverflow.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();
     }
   });
 }

ClientServer发送一次请求,这时Server并未及时处理该请求,而是等到Server端产生新消息才处理该请求,然后将结果发给ClientClient收到消息后,会重新向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时,ClientServer建立连接后,可以双向传输消息,当Server有新消息时,可以直接发给Client 


5. WebSocketHTTP keep-alive

HTTP keep-aliveHTTP 持久连接)是使用同一个TCP连接来发送和接收多个HTTP request/response,而不是为每一个新的request/response打开新的连接的方法

在 HTTP 1.1 中,所有的连接默认都是持续连接,除非特殊声明不支持

Chromekeep-alive值为300s

Tomcat可在server.xmlConenctor标签中设置keepAliveTimeout属性。默认情况下,keepAliveTimeout=connectionTimeout,即20skeepAliveTimeout设置为-1,则连接永久有效

HTTP keep-alive,虽然也保存了连接,但仍是requestresponse模式,Server不能主动向Client发送消息

6. WebSocketdemo

打开http://www.websocket.org/echo.html,可看到当前浏览器是否支持WebSocket。如果支持,点击”Connect”,连接成功后,点”Send”即可发送消息


该页面下方,有个创建WebSocket的例子

7. WebSocket API

http://dev.w3.org/html5/websockets/

总结下WebSocket特点:

ClientServer之间的连接可以一直使用,直到某一方关闭连接;避免了频繁建立、断开连接所产生的CPU、内存开销;ClientServer之间可以双向传输消息

 

参考文章:

http://www.websocket.org/

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://stackoverflow.com/questions/7620620/whats-the-behavioral-difference-between-http-stay-alive-and-websockets

http://stackoverflow.com/questions/17608551/how-is-websocket-different-than-http-with-header-connection-keep-alive-million

http://stackoverflow.com/questions/10028770/html5-websocket-vs-long-polling-vs-ajax-vs-webrtc

http://stackoverflow.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet?lq=1

初识html5 WebSocket,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。