WebSocket简介
WebSocket protocol 是HTML5一种新的协议(protocol)。它是实现了浏览器与服务器全双工通信(full-duplex)。
现在,很多网站为了实现即时通讯(real-time),所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(time interval)(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求(request),然而HTTP request 的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占用很多的带宽。
而最比较新的技术去做轮询是采用AJAX,但这种技术虽然可达到全双工通信,但依然需要发出请求(reuqest)。
在WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即使服务带来了两大好处:1. Header 互相沟通的Header是很小的-大概只有 2 Bytes 2. Server Push 服务器可以主动传送数据给客户端。
websocket通信协议实现的是基于浏览器的原生socket,目前firefox4.x及chrome的最新版都支持websocket对象。详细的websocket API,可以参考此文: http://dev.w3.org/html5/websockets/。需要说明的是,html5的标准化工作仍在进行中,其完全稳定下来可能需要5-10年的时间,因此其中许多规范包括这里有websocket都是不稳定的,你需要及时跟进才可以开发出正确的应用程序。
我们来简单看下websocket的IDL定义:
[Constructor(in DOMString url, in optional DOMString protocols)]
[Constructor(in DOMString url, in optional DOMString[] protocols)]interface WebSocket
在客户端的JS脚本中使用websocket对象是十分简单的,只需要生成一个对象,随后定义4个事件处理函数即可。下面是一个极为简单的示例:
var ws = new websocket(ws://www.xxx.com/path)
ws.onopen=function(){alert("connection opened")}
ws.onerror=function(){}
ws.onmessage=function(msg){alert(msg)}
ws.onclose=function(){alert("connection close")}
ws.send("hello server")
ws.close()
目前支持websocket的服务器很多,apache已经支持,此外还有其他一些专门的websocket非web服务器的实现,比如基于java实现的jwebsockets。
下面介绍一下websocket的协议。其协议过程十分简单,首先是类http请求、响应的握手过程,一旦握手成功,以后的双向通信便直接基于tcp协议传送数据,而不再使用http进行封装,从而减少了不必要的数据传输。握手协议也十分简单,可以用下面的两段http交互表示:
GET /path HTTP/1.1
HTTP/1.1 101 Web Socket Protocol Handshake