HTML5 WebSocket
更新日期:
HTML5 有许多引人注目的新特性,如 Canvas、本地存储、多媒体编程接口、WebSocket 等。其中,WebSocket 有“Web的TCP”之称,它使浏览器支持 Socket 成为可能,从而在浏览器和服务器间提供了一个基于 TCP 连接的双向通道。Web 开发人员可以很方便的用 WebSocket 构建实时 Web 应用。
从以下4点来认识 HTML5 WebSocket:
它是什么?
它解决了什么问题?
它的原理?
它怎么用?
它是什么
WebSocket 是 HTML5 提供的一种浏览器和服务器之间进行全双工通信的网络技术。在 WebSocket API 中,浏览器和服务器只需要做一个握手动作,然后就形成了一个快速通道,二者之间就可以直接进行数据传送了。
其实,WebSocket就是一个应用层的通信协议,协议名ws。它和HTTP一样,都是基于TCP(传输层协议)的。
它解决了什么问题?
当要实现对实时性要求较高的 Web 应用时,比如在线游戏、在线聊天等。传统的处理方式是用轮询和Comet技术。而Comet技术实际是对轮询技术的改进,又可分为长轮询机制和流技术。分别如下:
轮询
客户端以一定的时间间隔向服务器发请求,以频繁请求的方式保持客户端和服务器端的同步。
问题:太多无谓的网络传输,低效(固定间隔请求嘛,那个时候服务器数据可能还没更新呢)
长轮询
对定时轮询的改进,目的是降低无效的网络传输。
方式:当服务器没有更新时,连接会保持一段周期知道数据改变|状态改变|时间过期。
问题:当服务器端数据频繁变更时,就和定时轮询差不多了
流
方式:在客户端页面使用一个隐藏窗口,向服务器发个长连接请求。服务器接到请求后作出回应,并不断更新连接状态,以保证客户端和服务器端的连接不过期。这样,就可以将服务器端的信息源源不断地推向客户端了。
问题:用户体验上,需要针对不同浏览器设计不同的方案来改进用户体验;同时,当并发较大时,对服务器资源也是个很大的考验。
其实,这些技术都不是真正的实时技术,只是用 Ajax 模拟实时的效果。问题有:
- 浏览器不断向服务器发请求:交互一次,都要一次 HTTP 的请求和应答
- 每次 HTTP 请求和应答都带有完整的 HTTP 头信息:HTTP request 的 header是非常长的,里面包含的数据很小很小,都会占用很多的带宽和服务器资源,这就增加了每次传输的数据量
于是~
HTML5 定义了 WebSocket 协议,以更好的节省服务器资源和带宽,并达到真正的实时通信。且WebSocket连接本质上就是一个TCP连接,所以在稳定性和传输量方面,都有很大优势。
它的原理?
WebSocket 协议本质上是一个基于 TCP 的协议。为建立一个 WebSocket 连接,浏览器首先向服务器发起一个 HTTP 请求。
这个请求和通常的 HTTP 请求很相似,但其中有些内容是和 WebSocket 协议密切相关的,包含了一些附加头信息
|
|
请求中的 Sec-WebSocket-Key 是浏览器向服务器提供的握手信息,服务器解析这些头信息,并生成一个16位的安全密钥并返回客户端。以表明服务器获取了客户端的请求,同意建立 WebSocket 连接。连接一旦建立,客户端和服务器端就可以双向传输数据了。
其中,websocket 的实现,浏览器扮演着一个很重要的角色。服务器端不受平台和开发语言的限制,只要遵从 WebSocket 规范即可。目前已经有比较成熟的 WebSocket 服务器端实现,有:php、ruby、Tomcat、node.js、python、Diango等。
它怎么用?
Web 开发人员的 WebSocket JavaScript 客户端接口是很简单的。
WebSocket JavaScript 定义:
url:WebSocket服务器的网络地址,协议通常是”ws”
send() 发送数据到服务器端
close() 关闭连接
建立 WebSocket 连接的实例 JavaScript 代码:
|
|
参考
WebSocket 维基百科:维基百科,挺牛叉,信息简短但不失专业,信息量还挺大
使用 HTML5 WebSocket 构建实时 Web 应用:IBM,挺系统
使用Node.js+Socket.IO搭建WebSocket实时应用:个人博客,看起来挺完整的。不过没亲自试过代码
WebSocket 是什么原理?为什么可以实现持久连接?:知乎,里面还有些讨论,有常识类的、也有扩展类的。不错。