读书人

WebSockets浅探及实践 - 一

发布时间: 2012-07-18 12:05:41 作者: rapoo

WebSockets浅探及实践 - 1

?

1 起源

在WebSocket没有出现之前,如果我们要实现从服务器向客户端推送数据的功能,就必须采取某些work around,诸如Http polling(Comet),BOSH(XMPP)等。 但是他们都基于HTTP协议之上,频繁建立连接的开销以及冗余的HTTP头信息,都带来了一定的延迟。由此,WebSockets也就应运而生了。

2 规范规范细节请详阅这里

连接建立过程当打开了到服务器的连接后,客户端必须向服务器发送一次opening握手--它由HTTP Upgrade请求以及一系列必须和可选的头部数据组成。

请求必须是Get方法,且HTTP协议版本至少为1.1。必须有Host,Upgrade(值必须包含websocket关键字),Connection(值必须包含"Upgrade"),Sec-WebSocket-Key请求头。如果请求者是浏览器,必须包含Origin头。必须包含Sec-WebSocket-Version头,且其值为13。可以包含Sec-WebSocket-Protocol以及Sec-WebSocket-Extensions头请求可以包含任何其他的头部域,譬如cookies或认证相关的头如Authorization。而后客户端就在等待服务器端的响应并进行验证:确定状态码是不是101,如果不是则遵循HTTP的响应处理过程。否则往下走确保响应头中必须包含Upgrade域,其中包含"websocket"值,否则连接失败;确保响应头包含Connect域,且有值"Upgrade",否则连接失败;确保响应头包含Sec-WebSocket-Accept域,且其值应该等于Base64(SHA-1(|Sec-WebSocket-Key|)+"258EAFA5-E914-47DA-95CA-C5AB0DC85B11");否则连接失败;如果响应头中包含了Sec-WebSocket-Extensions域,而请求头并未包含,那么客户端必须中断连接;如果响应头中包含Sec-WebSocket-Protocol域,但在请求头中并没有包含此子协议值,客户端必须中断连接.如果以上条件俱都满足,那么这个连接就建立了起来,并且处于open状态,可以进行后续的数据发送/接收等操作。
典型的请求头结构如下:
exampleSocket.onmessage =  function  (event) {        console.log(event.data);  }  
如何关闭连接:exampleSocket.close();但是在关闭连接前最好检查下bufferedAmount看看是不是还有数据没有发送完成。
浏览器支持
FeatureChromeFirefox(Gecko)IEOperaSafariVersion -76 support(Obsolete)64.0 (2.0)--11.00(disabled)5.0.1Protocol version 7 support--6.0(6.0)------Protocol version 10 support147.0(7.0)Html5 Labs??RFC 6455 Support (IETF Draft 17)1611.0(11.0)10??在FireFox 6.0-10.0中,需要使用MozWebSocket对象,而之后则是WebSocket对象。
参考实现Java?????参阅:WebSocketAPI?????AtmosphereNodeJS?????Socket.io?????Websocket-NodeRuby? ? ? ?EM-Websocket
Reference1.?WebSocket规范?http://tools.ietf.org/html/rfc64552. WebSocket API定义?http://dev.w3.org/html5/websockets/3.?https://developer.mozilla.org/en/WebSockets/Writing_WebSocket_client_applications4.?http://www.infoq.com/presentations/WebSockets-The-Web-Communication-Revolution5. WebSocket Vs. Rest?http://nbevans.wordpress.com/2011/12/16/websockets-versus-rest-fight/6. JAVA websocket实现?http://java.net/projects/websocket-spec/pages/WebSocketAPIs

读书人网 >Web前端

热点推荐