WebSocket协议是一种基于TCP协议的新型网络协议。它允许服务器推送消息给客户端,实现了浏览器和服务器之间的双工通信。
HTTP
HTTP(超文本传输协议)是互联网应用最广泛的网络协议,但是它也有着自己的局限性。HTTP协议是单向,且无状态的。意思就是客户端(浏览器)发起一次HTTP请求,不管服务器能否进行正常的响应,响应结束后,这次通信就会断开。并且服务器不具备有主动
向客户端(浏览器)发送消息的能力。
其局限性在面对如下应用场景时就会暴露出来:
- 服务器端的数据不定时更新,可能间隔很短,也可能间隔很长
- 实时双工的通信应,如即时聊天
当然,我们可以通过一些轮询的方法,来从功能上实现这个需求。
比如,我们可以设置一个请求间隔非常短的定时器,在需求的间隔下,不停地请求服务端,再根据服务端的相应来进行数据的更新。但是这无疑是很耗费性能的。
如果更新间隔非常长,那么可能我们大部分的请求都是无用的。
所以,我们需要一种能够双向实时通信的网络协议,来补足HTTP
协议的局限。
WebSocket协议由此得以出现。
WebSocket
WebSocket协议的连接,首先我们需要服务器对WebSocket的支持。我们通过浏览器发送一个WebSocket连接请求,然后服务器做出回应。这个连接的过程通常被称为握手
。在握手后,服务器和浏览器之间就建立了一个数据传送通道,可以互相传送消息。
优点
在建立了WebSocket连接后,服务器不需要再等待客户端请求数据才能做出相应,服务器可以在数据更新后主动向客户端推送此次更新。
API
HTML5的新特性内包含了一些WebSocket
协议的API。
创建对象
1 | var ws = new WebSocket(url, name); |
url为WebSocket服务器的地址,name为发起握手的协议名称,可选。
发送消息
1 | ws.send(msg); |
msg为文本消息,字符串格式。其他类型可以通过二进制来发送。
接收消息
1 | ws.onmessage = (function () { |
错误处理
1 | ws.onerror = (function () { |
关闭连接
1 | ws.close(); |