From ae05c627c6b688d41e0770a6e5e3e2a4553f29ac Mon Sep 17 00:00:00 2001 From: he wei <858544502@qq.com> Date: 星期二, 05 十一月 2024 10:44:53 +0800 Subject: [PATCH] U websocket 重连机制 --- src/hooks/useWebSocket.js | 75 +++++++++++++++++++++++++++++++++---- 1 files changed, 67 insertions(+), 8 deletions(-) diff --git a/src/hooks/useWebSocket.js b/src/hooks/useWebSocket.js index 33a7c81..d106f23 100644 --- a/src/hooks/useWebSocket.js +++ b/src/hooks/useWebSocket.js @@ -11,10 +11,13 @@ export default function (url) { url = getWsUrl(url); + // 閲嶈繛鏃堕棿闂撮殧 榛樿5绉� + const reConnectDelay = 5 * 1000; const socket = ref(null); const isConnected = ref(false); const message = ref(""); + let timer = null; const sendCallback = reactive([]); @@ -38,14 +41,13 @@ message.value = event.data; }; - socket.value.onerror = (error) => { - console.error("WebSocket Error:", error, url); + socket.value.onerror = (Event) => { + console.error("WebSocket Error:", Event, url); + WSClose(Event); }; - socket.value.onclose = () => { - isConnected.value = false; - console.log("WebSocket 杩炴帴宸插叧闂�, url: ", url); - }; + socket.value.onclose = WSClose; + }; // 鍙戦�佹暟鎹� @@ -57,6 +59,63 @@ sendCallback.push(() => sendData(data)); } }; + + function WSClose(Event) { + isConnected.value = false; + if (socket.value) { + switch (socket.value.readyState) { + case 0: + socket.value.onopen = () => { + socket.value.close(); + console.log('閾炬帴鍏抽棴', url, 'close浜嬩欢瀵硅薄:', Event); + socket.value = null; + // 娌℃湁event瀵硅薄 鍒欎负鎵嬪姩鍏抽棴 + if (Event) { + reConnect(); + } + } + break; + case 1: + socket.value.close(); + console.log('閾炬帴鍏抽棴', url, 'close浜嬩欢瀵硅薄:', Event); + socket.value = null; + // 娌℃湁event瀵硅薄 鍒欎负鎵嬪姩鍏抽棴 + if (Event) { + reConnect(); + } + break; + case 2: + socket.value.onclose = () => { + console.log('閾炬帴鍏抽棴', url, 'close浜嬩欢瀵硅薄:', Event); + socket.value = null; + // 娌℃湁event瀵硅薄 鍒欎负鎵嬪姩鍏抽棴 + if (Event) { + reConnect(); + } + } + break; + case 3: + console.log('閾炬帴鍏抽棴', url, 'close浜嬩欢瀵硅薄:', Event); + socket.value = null; + // 娌℃湁event瀵硅薄 鍒欎负鎵嬪姩鍏抽棴 + if (Event) { + reConnect(); + } + break; + } + } + } + + // 閲嶈繛 + function reConnect() { + if (timer) { + return false; + } + timer = setTimeout(() => { + timer = null; + connect(); + }, reConnectDelay); + } onMounted(() => { // console.log('socket mount', Date.now(), '============='); @@ -74,13 +133,13 @@ onDeactivated(() => { if (socket.value) { - socket.value.close(); + WSClose(); } }); onUnmounted(() => { if (socket.value) { - socket.value.close(); + WSClose(); } }); -- Gitblit v1.9.1