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