diff --git a/src/websocket.js b/src/websocket.js index 17899ea..7b48ea2 100644 --- a/src/websocket.js +++ b/src/websocket.js @@ -1,5 +1,14 @@ let socket = null; let heartbeatInterval = null; +let reconnectCount = 0; +let reconnectTimer = null; + +// 重连配置 +const RECONNECT_CONFIG = { + MAX_COUNT: 10, // 最大重连次数 + INITIAL_DELAY: 2000, // 初始重连延迟(2秒) + MAX_DELAY: 60000, // 最大重连延迟(1分钟) +}; /** * 建立 WebSocket 连接 @@ -8,7 +17,10 @@ function createWebSocket(token, onMessage) { const url = `wss://api.shelingxingqiu.com/socket?authorization=${token}`; socket = uni.connectSocket({ url, - success: () => console.log("websocket 连接成功"), + success: () => { + console.log("websocket 连接成功"); + reconnectCount = 0; // 重置重连次数 + }, }); // 接收消息 @@ -19,24 +31,47 @@ function createWebSocket(token, onMessage) { // 错误处理 uni.onSocketError((err) => { console.error("WebSocket 错误", err); + reconnect(token, onMessage); }); uni.onSocketClose((result) => { console.log("WebSocket 已关闭", result); - socket = uni.connectSocket({ - url, - success: () => console.log("websocket 连接成功"), - }); + stopHeartbeat(); + reconnect(token, onMessage); }); // 启动心跳 startHeartbeat(); } +/** + * 重连机制 + */ +function reconnect(token, onMessage) { + if (reconnectCount >= RECONNECT_CONFIG.MAX_COUNT) return; + + reconnectTimer && clearTimeout(reconnectTimer); + + // 计算重连延迟(指数退避) + const delay = Math.min( + RECONNECT_CONFIG.INITIAL_DELAY * Math.pow(2, reconnectCount), + RECONNECT_CONFIG.MAX_DELAY + ); + + reconnectTimer = setTimeout(() => { + console.log("reconnecting..."); + createWebSocket(token, onMessage); + reconnectCount++; + }, delay); +} + function closeWebSocket() { if (socket) { socket.close(); stopHeartbeat(); + // 清理重连定时器 + reconnectTimer && clearTimeout(reconnectTimer); + reconnectCount = 0; } }