WebSocket使用总结

771 阅读4分钟

WebSocket 是一种在客户端与服务器之间保持TCP长连接的网络协议,这样它们就可以随时进行信息交换。

虽然任何客户端或服务器上的应用都可以使用WebSocket,但原则上还是指浏览器与服务器之间使用。通过WebSocket,服务器可以直接向客户端发送数据,而无须客户端周期性的请求服务器,以动态更新数据内容
来源MDN

基础信息

# 请求报文
GET /chat HTTP/1.1
Host: server.example.com
# 通知服务器 是websocket协议。
Upgrade: websocket
Connection: Upgrade
# Base64 encode的值,这个是浏览器随机生成的,验证Websocket服务
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== 
# 用户定义的字符串,用来区分同URL下,不同的服务所需要的协议
Sec-WebSocket-Protocol: chat, superchat
# 要求服务器所使用的Websocket Draft(协议版本)
Sec-WebSocket-Version: 13
Origin: http://example.com

# 返回报文

# 101 状态码为101,表示同意客户端协议转换请求,并将它转换为websocket协议
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
# 回复上述验证 加密后的 Sec-WebSocket-Key
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
# 最终使用的协议
Sec-WebSocket-Protocol: chat
  • websocket提供两种数据传输:文本数据和二进制数据;
  • websocket能够提供低延迟,高性能的客户端与服务端的双向数据通信。它颠覆了之前web开发的请求处理响应模式,并且提供了一种真正意义上的客户端请求,服务器推送数据的模式,特别适合实时数据交互应用开发。
  • 对比http的客户端服务器的交互图可以发现WebSocket方式减少了很多TCP打开和关闭连接的操作,WebSocket的资源利用率高。

服务器的响应,不是随意的,需要遵循一定的规则 请参考RFC 文档 第 6/7页:
获取客户端请求的 Sec-Weboscket-Key 字段值,去除收尾空白字符 与全球唯一标识符拼接 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 sha1 加密(短格式) base64 加密

构造函数

new Websocket(url[,protocols]); // 返回Websocket对象

参数

参数 介绍
url 要连接的URL
protocols* 单协议字符串或者包含协议字符串的数组。这些字符串用于指定子协议,这样单个服务器可以实现多个WebSocket子协议(例如,您可能希望一台服务器能够根据指定的协议处理不同类型的交互)protocol)。如果不指定协议字符串,则假定为空字符串

继承

继承于EventTarget 可以使用EventTargetaddEventListener等乱七八糟的方法

属性

属性 解释
Socket.readyState 只读属性 readyState 表示连接状态,可以是以下值:
0 - 表示连接尚未建立。
1 - 表示连接已建立,可以进行通信。
2 - 表示连接正在进行关闭。
3 - 表示连接已经关闭或者连接不能打开。
Socket.bufferedAmount 只读 bufferedAmount 已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数。
Socket.binaryType 'arraybuffer' - 使用二进制的数据类型连接
'blob' - 如果传输的是 Blob 类型的数据。

方法

方法 描述
close(code,reason) 关闭连接
code 可选 一个数字状态码 默认1005,参见 状态码列表
reason可选String 断开时发送的信息
send 使用连接发送数据 长度小于123

事件

事件 描述
open 连接建立时触发
message 客户端接收服务端数据时触发
error 通信发生错误时触发
close 连接关闭时触发

event 由一个MessageEvent调用

属性 描述
data 只读 - 返回 DOMString, Blob 或者 ArrayBuffer,包含来自发送者的数据
source 只读 - 代表消息发送者
ports 对象数组,表示消息正通过特定通道(数据通道)发送的相关端口(适用于通道消息传输或者向一个共享线程(shared work )发送消息时)
origin 返回一个表示消息发送者来源的USVString

参考