跳转到内容

WebSocket

维基百科,自由的百科全书

这是本页的一个历史版本,由Html5 exchange留言 | 贡献2010年12月1日 (三) 05:46 建立内容为“== WebSocket == HTML5的一个突破是它为新一代的网页编程提供了很多方便的API,使编程人员很容易的就可以做到很多样...”的新頁面)编辑。这可能和当前版本存在着巨大的差异。

(差异) ←上一修订 | 最后版本 (差异) | 下一修订→ (差异)

WebSocket

HTML5的一个突破是它为新一代的网页编程提供了很多方便的API,使编程人员很容易的就可以做到很多样化的网页应用程序,而WebSocket API 就是其中一个。

WP:LS

什么是 Websocket API?

WebSocket protocol 是HTML5一种新的协议(protocol)。它是实现了浏览器与伺服器全双工通信(full-duplex)。

先在,很多网站为了实现即时通讯(real-time),所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(time interval)(如每1秒),由浏览器对伺服器发出HTTP request,然后由伺服器返回最新的数据给客服端的浏览器。这种传统的HTTP request d的模式带来很明显的缺点 – 浏览器需要不断的向伺服器发出请求(request),然而HTTP request 的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占用很多的带宽。

而最比较新的技术去做轮询的效果是Comet – 用了AJAX。但这种技术虽然可达到全双工通信,但依然需要发出请求(reuqest)。

在 WebSocket API,浏览器和伺服器只需要要做一个握手的动作,然后,浏览器和伺服器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即使服务带来了两大好处:

1. Header

互相沟通的Header是很小的-大概只有 2 Bytes

2. Server Push

伺服器可以主动传送数据给客户端

握手协议

在实现websocket连线过程中,需要透过浏览器发出websocket连线请求,然后伺服器发出回应,这个过程通常称为“握手” (handshaking)。

浏览器请求(request from browser) GET /demo HTTP/1.1 Host: example.com Connection: Upgrade Sec-WebSocket-Key2: 12998 5 Y3 1 .P00 Sec-WebSocket-Protocol: sample Upgrade: WebSocket Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5 Origin: http://example.com ^n:ds[4U 伺服器回应(server response) HTTP/1.1 101 WebSocket Protocol Handshake Upgrade: WebSocket Connection: Upgrade Sec-WebSocket-Origin: http://example.com Sec-WebSocket-Location: ws://example.com/demo Sec-WebSocket-Protocol: sample 8jKS’y:G*Co,Wxa-

原理

在请求中的Sec-WebSocket-Key1, Sec-WebSocket-Key2 和最后的数字(^n:ds[4U)都是随机的,伺服器方面会用这些数据来构造出一个16Byte的回应。

把第一个Key的数字除以第一个KEY的空白间的数量,而第二个KEY也是如此。然后把这两个数字和最后的数字连接起来成为1个字串,而这个字串连接起来成为1个字串,而这个字串是MD5的和。

浏览器

实现websocket的协议,浏览器扮演者一个很重要的角色。互联网巨擎-谷歌公司(google)一直都是不断推动互联网的发展,不断推出为互联网带来新的冲击。不错,他也是不断推动HTML5发展的主力。永远走在互联网最前线的谷歌在它的CHROME浏览器支持了websocket。(CRHOME 5 之后的版本都支持websocket,但因为websocket还未最终版本,草拟不断更新,所以不同的版本会支持不同的draft)

此外,苹果当然也不断推动HTML5的发展,Safari浏览器也支持websocket了。然而,Mozilla的Firefox会在Firefox 4版本支持websocket。(Firefox 4 正式版预计会在2011年初面世)。至于Opera 方面,它在10.7的版本中也支持了websocket。


伺服器

在伺服器方面,网上都有不同对websocket支持的伺服器:

1. php – http://code.google.com/p/phpwebsocket/

2. jetty – http://jetty.codehaus.org/jetty/ (版本7才开始支持websocket)

3. netty – http://www.jboss.org/netty

4. ruby - http://github.com/gimite/web-socket-ruby

5. Kaazing - http://www.kaazing.org/confluence/display/KAAZING/Home