您的位置:首页 > Web前端 > HTML5

初识html5 WebSocket

2014-05-23 18:36 295 查看
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://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获取的消息
     },
     error: function(){
       //错误处理
     },
     complete: 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获取的消息
     },
     error: function(){
      //错误处理
     },
     complete: 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://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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: