WebSocket
WebScoket是在单个TCP连接上进行全双工的协议。它的出现只要是为了解决服务器推送的问题。在HTTP/2出现之前,很多网站为了实现推送都采用轮询技术。由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给浏览器。这种模式的缺点显而易见-客户端需要不断地向服务器发出请求,浪费了服务器和带宽资源。
在轮询技术中,较新的技术是Comet。但是Comet采用长连接来实现双向通信,会消耗服务器资源。
1、WebSocket的优点
WebSocket的出现,解决了普遍存在的服务器推送问题。具有以下优点:
(一)减少控制开销。websocket的协议头部只有2-10字节。
(二)更强的实时性。websocket的连接时全双工的,所以服务器可以随时主动给客户端下发数据。
(三)保持连接状态。websocket是有状态的协议,建立连接之后的通信都可以省略部分状态信息。
(四)支持二进制帧。
(五)可以支持扩展。Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。
(六)更好的压缩效率。
(七)没有同源限制,客户端可以与任意服务器通信。
2、客户端API
WebSocket构造函数
var ws = new WebSocket('ws://localhost:8080');
执行上面的语句之后,客户端就会与服务器进行连接。
webSocket.readyState
webSocket.readyState返回实例对象的当前状态,共有四种。
CONNECTING:值为0,表示正在连接。
OPEN:值为1,表示连接成功,可以通信了。
CLOSING:值为2,表示连接正在关闭。
CLOSED:值为3,表示连接已经关闭,或者打开连接失败。
webSocket.onopen
实例对象的onopen属性,用于指定连接成功后的回调函数。
ws.onopen = function() {
ws.send('Hello, Server');
}
webSocket.onclose
实例对象的onclose属性,用于指定连接关闭后的回调函数。
ws.onclose = function(event) {
console.log(event.code);
}
webSocket.onmessage
实例对象的onmessage属性,用于指定收到服务器数据后的回调函数。服务器的数据可能是文本(blob对象),也可能是二进制数据(ArrayBuffer对象)。
ws.onmessage = function(event) {
if(typeof event.data === String) {
// blob对象
}
if(event.data instanceof ArrayBuffer) {
// ArrayBuffer对象
}
}
webSocket.send()
实例对象的send()方法用于向服务器发送数据。
ws.send('hello,server');
webSocket.bufferedAmount
实例对象的bufferedAmount属性,表示还有多少个字节的二进制数据没有发出去。它可以用来判断是否结束。
var data = new ArrayBuffer(100000);
ws.send(data);
if(ws.bufferedAmount === 0) {
// 发送完毕
} else {
// 发送未结束
}
webSocke.onerror
实例对象的onerror属性,用于指定报错时的回调函数。
ws.onerror = function() {
// handle error event
}
3、参考文献
Last updated