From 0000e935d6c7f74cb6682aea1bbf24d8deade390 Mon Sep 17 00:00:00 2001
From: wwl <xchao828@163.com>
Date: 星期四, 03 七月 2025 17:49:18 +0800
Subject: [PATCH] 1

---
 src/utils/websocket.js |  104 +++++++++++++++++++++++++--------------------------
 1 files changed, 51 insertions(+), 53 deletions(-)

diff --git a/src/utils/websocket.js b/src/utils/websocket.js
index a525f68..40529b1 100644
--- a/src/utils/websocket.js
+++ b/src/utils/websocket.js
@@ -1,80 +1,78 @@
 // src/utils/websocket.js
-let socket = null;
+let ws = null;
 let reconnectAttempts = 0;
 const maxReconnectAttempts = 5;
-const reconnectInterval = 5000;
-let messageCallback = null;
+const reconnectInterval = 5000; // 5绉掗噸杩為棿闅�
+const pingInterval = 5000; // 5绉掑彂閫乸ing
 
-const initWebSocket = (token, callback) => {
-  if (socket && socket.readyState === WebSocket.OPEN) {
-    console.log('WebSocket 宸茶繛鎺ワ紝鏃犻渶閲嶅鍒濆鍖�');
-    return;
-  }
-
+export function initWebSocket(token, onMessage) {
   if (!token) {
-    console.error('鏈彁渚� token锛屾棤娉曞缓绔� WebSocket 杩炴帴');
-    callback('error', '鏈壘鍒� token锛屾棤娉曞缓绔� WebSocket 杩炴帴');
+    console.error('WebSocket 鍒濆鍖栧け璐ワ細缂哄皯 token');
     return;
   }
 
-  const wsUrl = `ws://192.168.1.2:5011/ws?token=${encodeURIComponent(token)}`;
-  console.log('灏濊瘯杩炴帴 WebSocket:', wsUrl);
+  const wsUrl = `ws://192.168.1.2:5011/ws?token=${token}`;
+  ws = new WebSocket(wsUrl);
 
-  try {
-    socket = new WebSocket(wsUrl);
-  } catch (error) {
-    console.error('WebSocket 鍒濆鍖栧け璐�:', error);
-    callback('error', '鏃犳硶鍒濆鍖� WebSocket 杩炴帴');
-    return;
-  }
-
-  messageCallback = callback;
-
-  socket.onopen = () => {
+  ws.onopen = () => {
     console.log('WebSocket 杩炴帴鎴愬姛');
     reconnectAttempts = 0;
+
+    // 鍚姩蹇冭烦鏈哄埗
+    const pingTimer = setInterval(() => {
+      if (ws.readyState === WebSocket.OPEN) {
+        console.log('鍙戦�� ping 娑堟伅');
+        ws.send('ping');
+      } else {
+        console.warn('WebSocket 鏈繛鎺ワ紝鍋滄 ping');
+        clearInterval(pingTimer);
+      }
+    }, pingInterval);
   };
 
-  socket.onmessage = (event) => {
-    console.log('WebSocket 鏀跺埌鍘熷娑堟伅:', event.data);
-    if (messageCallback) {
-      messageCallback('message', event.data);
+  ws.onmessage = (event) => {
+    const data = event.data;
+    console.log('WebSocket 鏀跺埌鍘熷娑堟伅:', data);
+    if (data === 'pong') {
+      console.log('鏀跺埌 pong 鍝嶅簲锛岃繛鎺ユ椿璺�');
+      return;
     }
+    onMessage('message', data);
   };
 
-  socket.onerror = (error) => {
+  ws.onerror = (error) => {
     console.error('WebSocket 閿欒:', error);
-    if (messageCallback) {
-      messageCallback('error', 'WebSocket 杩炴帴閿欒');
-    }
+    onMessage('error', 'WebSocket 杩炴帴閿欒');
   };
 
-  socket.onclose = (event) => {
-    console.log('WebSocket 杩炴帴鍏抽棴锛屼唬鐮�:', event.code, '鍘熷洜:', event.reason);
+  ws.onclose = () => {
+    console.warn('WebSocket 杩炴帴鍏抽棴');
     if (reconnectAttempts < maxReconnectAttempts) {
+      reconnectAttempts++;
+      console.log(`灏濊瘯閲嶈繛 (${reconnectAttempts}/${maxReconnectAttempts})...`);
       setTimeout(() => {
-        console.log(`灏濊瘯閲嶈繛 (${reconnectAttempts + 1}/${maxReconnectAttempts})`);
-        reconnectAttempts++;
-        initWebSocket(token, callback);
+        initWebSocket(token, onMessage);
       }, reconnectInterval);
     } else {
-      if (messageCallback) {
-        messageCallback('error', 'WebSocket 閲嶈繛澶辫触锛岃妫�鏌ョ綉缁滄垨鏈嶅姟鍣�');
-      }
+      console.error('杈惧埌鏈�澶ч噸杩炴鏁帮紝鍋滄閲嶈繛');
+      onMessage('error', 'WebSocket 杩炴帴澶辫触锛屽凡杈炬渶澶ч噸杩炴鏁�');
     }
   };
-};
 
-const closeWebSocket = () => {
-  if (socket) {
-    socket.close(1000, '娴忚鍣ㄥ叧闂紝姝e父鏂紑');
-    socket = null;
-    console.log('WebSocket 杩炴帴宸插叧闂�');
+  // 娓呯悊 WebSocket
+  window.addEventListener('beforeunload', () => {
+    if (ws) {
+      ws.close();
+      ws = null;
+      console.log('WebSocket 宸叉竻鐞�');
+    }
+  });
+}
+
+export function closeWebSocket() {
+  if (ws) {
+    ws.close();
+    ws = null;
+    console.log('WebSocket 宸插叧闂�');
   }
-};
-
-window.addEventListener('beforeunload', () => {
-  closeWebSocket();
-});
-
-export { initWebSocket, closeWebSocket };
\ No newline at end of file
+}
\ No newline at end of file

--
Gitblit v1.8.0