socket重连机制优化

This commit is contained in:
kron
2025-06-18 00:35:16 +08:00
parent 78504f501d
commit 18c280a4b4

View File

@@ -1,5 +1,14 @@
let socket = null; let socket = null;
let heartbeatInterval = 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 连接 * 建立 WebSocket 连接
@@ -8,7 +17,10 @@ function createWebSocket(token, onMessage) {
const url = `wss://api.shelingxingqiu.com/socket?authorization=${token}`; const url = `wss://api.shelingxingqiu.com/socket?authorization=${token}`;
socket = uni.connectSocket({ socket = uni.connectSocket({
url, url,
success: () => console.log("websocket 连接成功"), success: () => {
console.log("websocket 连接成功");
reconnectCount = 0; // 重置重连次数
},
}); });
// 接收消息 // 接收消息
@@ -19,24 +31,47 @@ function createWebSocket(token, onMessage) {
// 错误处理 // 错误处理
uni.onSocketError((err) => { uni.onSocketError((err) => {
console.error("WebSocket 错误", err); console.error("WebSocket 错误", err);
reconnect(token, onMessage);
}); });
uni.onSocketClose((result) => { uni.onSocketClose((result) => {
console.log("WebSocket 已关闭", result); console.log("WebSocket 已关闭", result);
socket = uni.connectSocket({ stopHeartbeat();
url, reconnect(token, onMessage);
success: () => console.log("websocket 连接成功"),
});
}); });
// 启动心跳 // 启动心跳
startHeartbeat(); 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() { function closeWebSocket() {
if (socket) { if (socket) {
socket.close(); socket.close();
stopHeartbeat(); stopHeartbeat();
// 清理重连定时器
reconnectTimer && clearTimeout(reconnectTimer);
reconnectCount = 0;
} }
} }