socket重连机制优化
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user