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