xb18
xb18
文章78
标签0
分类0
WebSocket

WebSocket

状态

WebSocket 对象有一个 readyState 属性,用于表示当前 WebSocket 的状态。readyState 的值可以是以下几种:

  1. 0WebSocket.CONNECTING): 表示正在连接中。在创建 WebSocket 对象后,但连接尚未建立时,readyState 的初始值为 0。
  2. 1WebSocket.OPEN): 表示连接已建立,可以进行通信。当 WebSocket 成功连接到服务器时,readyState 的值变为 1。
  3. 2WebSocket.CLOSING): 表示连接正在关闭中。当 WebSocket 的关闭握手正在进行时,readyState 的值变为 2。
  4. 3WebSocket.CLOSED): 表示连接已关闭或连接无法建立。当 WebSocket 连接关闭或连接无法建立时,readyState 的值变为 3。

可以通过监听 onopenoncloseonerror 事件,或者通过访问 readyState 属性来获取当前 WebSocket 的状态信息

关闭码/状态码

在WebSocket中,关闭码用于指示连接关闭的原因。以下是一些常见的WebSocket关闭码:

  • 1000: 正常关闭,表示连接已成功关闭。
  • 1001: 终端离开,表示终端或浏览器离开了页面。
  • 1002: 协议错误,表示收到了不符合WebSocket协议要求的数据。
  • 1003: 数据错误,表示收到的数据包含无效数据或格式错误。
  • 1005: 没有提供关闭码,此关闭码表示没有提供具体的关闭原因。
  • 1006: 无法连接,表示连接无法建立,可能是由于服务器无法访问或连接超时等原因。
  • 1011: 服务器遇到严重错误,表示服务器遇到了无法处理的异常或错误。
  • 1015: TLS握手失败,表示在建立安全连接时发生TLS握手失败。

除了这些常见的关闭码,WebSocket还允许自定义的关闭码,可以根据具体的应用需求定义其他关闭码。

请注意,关闭码1004被保留为保留关闭码,不应被使用。

WebSocket协议规定,关闭码的范围应该从 3000 到 4999。这个范围是用于自定义关闭码,允许应用程序定义特定的关闭码来表示特定的关闭原因或错误情况。

简单封装async-await

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class socket {
constructor(wsUrl) {
this.requestArr = [];
this.ws = null;
this.id = 0;
this.wsUrl = null;
// this.retryConnect = 0;
if (wsUrl) {
this.init(wsUrl);
}
}

init(wsUrl) {
// init ws
return new Promise((resolve, reject) => {
this.wsUrl = wsUrl;
this.ws = new WebSocket(wsUrl);
this.ws.onopen = resolve;
this.ws.onmessage = (event) => {
this.wsOnMessage(event);
};
this.ws.onerror = reject;
this.ws.onclose = () => {
this.wsOnClose();
};
});
}

request(method, params) {
return new Promise((resolve, reject) => {
const cb = (data) => {
resolve(data);
};
const wsParams = { id: this.id, method: method, params: params };
if (this.ws) {
this.ws.send(JSON.stringify(wsParams));
this.requestArr.push({ id: this.id, method: method, cb: cb });
this.id = this.id < 2147483647 ? this.id + 1 : 0; // 2^31-1,是32位操作系统中最大的符号型整型常量
} else {
reject('ws is null');
}
});
}

wsOnClose() {
this.ws = null;
}

wsOnMessage(event) {
let data = JSON.parse(event.data);
let requestArrItem = this.requestArr.find(item => data.id === item.id);
this.requestArr = this.requestArr.filter(item => data.id !== item.id);
requestArrItem.cb(data);
}
}
本文作者:xb18
本文链接:https://moelj.com/2023/10/07/websocket/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可