From 55ed081b8414698e6e3b7d76c5c4032f264fb53f Mon Sep 17 00:00:00 2001 From: wwl <xchao828@163.com> Date: 星期四, 24 七月 2025 09:10:27 +0800 Subject: [PATCH] 1 --- src/utils/websocket.js | 119 +++++++++++++++++++++++++++++++++-------------------------- 1 files changed, 67 insertions(+), 52 deletions(-) diff --git a/src/utils/websocket.js b/src/utils/websocket.js index a525f68..9d956c5 100644 --- a/src/utils/websocket.js +++ b/src/utils/websocket.js @@ -1,80 +1,95 @@ // src/utils/websocket.js -let socket = null; +let ws = null; let reconnectAttempts = 0; +let pingTimer = null; // 鐢ㄤ簬绠$悊蹇冭烦瀹氭椂鍣� 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); - - try { - socket = new WebSocket(wsUrl); - } catch (error) { - console.error('WebSocket 鍒濆鍖栧け璐�:', error); - callback('error', '鏃犳硶鍒濆鍖� WebSocket 杩炴帴'); + // 濡傛灉 ws 宸插瓨鍦ㄤ笖杩炴帴娲昏穬锛屽垯璺宠繃鍒濆鍖� + if (ws && ws.readyState === WebSocket.OPEN) { + console.log('WebSocket 宸茶繛鎺ワ紝璺宠繃閲嶅鍒濆鍖�'); return; } - messageCallback = callback; + // 濡傛灉 ws 瀛樺湪浣嗘湭鍏抽棴锛屽厛鍏抽棴鏃ц繛鎺� + if (ws) { + console.warn('鍙戠幇鏃� WebSocket 杩炴帴锛屾鍦ㄥ叧闂�...'); + closeWebSocket(); + } - socket.onopen = () => { - console.log('WebSocket 杩炴帴鎴愬姛'); - reconnectAttempts = 0; + const wsUrl = `ws://192.168.1.244:5011/ws?token=${token}`; + ws = new WebSocket(wsUrl); + + ws.onopen = () => { + reconnectAttempts = 0; // 閲嶇疆閲嶈繛璁℃暟 + + // 鍚姩蹇冭烦鏈哄埗 + if (pingTimer) clearInterval(pingTimer); // 娓呯悊鏃у畾鏃跺櫒 + pingTimer = setInterval(() => { + if (ws && ws.readyState === WebSocket.OPEN) { + ws.send('ping'); + } else { + console.warn('WebSocket 鏈繛鎺ワ紝鍋滄 ping'); + clearInterval(pingTimer); + pingTimer = null; + } + }, 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 鍝嶅簲锛岃繛鎺ユ椿璺�'); + reconnectAttempts = 0; // 閲嶇疆閲嶈繛璁℃暟锛岀‘淇濇椿璺冭繛鎺ヤ笉瑙﹀彂閲嶈繛 + return; } + onMessage('message', data); }; - socket.onerror = (error) => { + ws.onerror = (error) => { console.error('WebSocket 閿欒:', error); - if (messageCallback) { - messageCallback('error', 'WebSocket 杩炴帴閿欒'); - } }; - socket.onclose = (event) => { - console.log('WebSocket 杩炴帴鍏抽棴锛屼唬鐮�:', event.code, '鍘熷洜:', event.reason); + ws.onclose = () => { + console.warn('WebSocket 杩炴帴鍏抽棴锛屾椂闂�:', new Date()); + if (pingTimer) { + clearInterval(pingTimer); + pingTimer = null; + } 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', () => { + closeWebSocket(); + }, { once: true }); // 纭繚浜嬩欢鐩戝惉鍙坊鍔犱竴娆� +} + +export function closeWebSocket() { + if (ws) { + ws.close(); + ws = null; + if (pingTimer) { + clearInterval(pingTimer); + pingTimer = 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