From b05c626d4076a2856a11afa9426c1810204b87fe Mon Sep 17 00:00:00 2001 From: Luk Date: Sun, 15 Sep 2024 00:41:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20initSocket({stateManager})?= =?UTF-8?q?=20=E5=8F=82=E6=95=B0=EF=BC=8C=E8=87=AA=E5=8A=A8=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=A4=96=E9=83=A8=E7=9A=84=E7=8A=B6=E6=80=81=E5=8F=98?= =?UTF-8?q?=E9=87=8F=20stateManager.socketAlive?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unisocket.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/unisocket.js b/unisocket.js index f3daaa9..1701716 100644 --- a/unisocket.js +++ b/unisocket.js @@ -3,13 +3,15 @@ const my = { reconnecting: undefined, heartbeating: undefined, listeners: {}, + heartbeatInterval: 20000, + reconnectInterval: 5000 } export default { isAlive () { return my.socket && (my.socket.readyState === my.socket.OPEN) }, - initSocket (url, relogin = false) { + initSocket ({ url, relogin = false, stateManager = {} } = {}) { if (!my.socket || (my.socket.readyState !== my.socket.OPEN && typeof url === 'string')) { console.log({ _at: new Date().toJSON(), about: `WebSocket is connecting to ${url}...` }) my.socket = uni.connectSocket({ @@ -18,10 +20,11 @@ export default { }) my.socket.onOpen((res) => { console.log({ _at: new Date().toJSON(), about: 'WebSocket onOpen: ', res }) + stateManager.socketAlive = true clearInterval(my.reconnecting) delete my.reconnecting - // 前端断线重连时,并不会自动提供 _passtoken。在前端initSocket时,应当把_passtoken送给后台,而后台则对_passtoken做验证后再加socketPool。 + // 前端断线重连时,并不会自动提供 _passtoken,应当把_passtoken送给后台,而后台则对_passtoken做验证后再加socketPool。 if (relogin && uni.getStorageSync('_passtoken')) { console.log({ _at: new Date().toJSON(), about: 'Reporting owner for reconnecting socket' }) my.socket.send({ data: JSON.stringify({ skevent: 'SOCKET_OWNER_RECONNECT', _passtoken: uni.getStorageSync('_passtoken') }) }) @@ -34,18 +37,20 @@ export default { clearInterval(my.heartbeating) delete my.heartbeating } - }, 20000) // 定期发送心跳,避免被关闭 + }, my.heartbeatInterval) // 定期发送心跳,避免被关闭 }) my.socket.onClose((res) => { console.log({ _at: new Date().toJSON(), about: 'Websocket onClose: ', res }) + stateManager.socketAlive = false if (!my.reconnecting) my.reconnecting = setInterval(() => { console.log({ _at: new Date().toJSON(), about: 'Websocket reconnecting...' }) - this.initSocket(url, true) - }, 5000) // 每5秒尝试重连 + this.initSocket({ url, relogin: true, stateManager }) + }, my.reconnectInterval) // 定时尝试重连 }) my.socket.onError((err) => { console.log({ _at: new Date().toJSON(), about: 'Websocket onError: ', err }) + stateManager.socketAlive = false }) my.socket.onMessage(({ data }) => { // 在这里统一分发消息(用户端通常不需要返回结果给服务器,因此不用 rpc 模式,而用 event 模式。