
WebSocket
状态
WebSocket 对象有一个 readyState 属性,用于表示当前 WebSocket 的状态。readyState 的值可以是以下几种:
0(WebSocket.CONNECTING): 表示正在连接中。在创建 WebSocket 对象后,但连接尚未建立时,readyState 的初始值为 0。1(WebSocket.OPEN): 表示连接已建立,可以进行通信。当 WebSocket 成功连接到服务器时,readyState 的值变为 1。2(WebSocket.CLOSING): 表示连接正在关闭中。当 WebSocket 的关闭握手正在进行时,readyState 的值变为 2。3(WebSocket.CLOSED): 表示连接已关闭或连接无法建立。当 WebSocket 连接关闭或连接无法建立时,readyState 的值变为 3。
可以通过监听 onopen、onclose、onerror 事件,或者通过访问 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; if (wsUrl) { this.init(wsUrl); } }
init(wsUrl) { 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; } 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); } }
|