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
可以使用EventTarget的addEventListener等乱七八糟的方法
属性
| 属性 | 解释 |
|---|---|
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 |