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看看是不是还有数据没有发送完成。