// main.js
import {initWs} from './wsClient'
ipcMain.on('loginOrRegistry', (e, data) => {
// ...
initWs({url: 'wss://......'}, e.sender)
})
// wsClient.js
import WebSocket from "ws";
const NODE_ENV = process.env.NODE_ENV;
let ws = null;
let maxReConnectTimes = null; // 最大重连次数
let lockReConnect = false; // 定义一个锁
let wsUrl = null;
let sender = null;
let needReconnect = null; // 是否需要重连
const initWs = (config, _sender) => {
wsUrl = NODE_ENV === 'development' ? config.url : config.url // 开发和生产环境的地址要区分开
sender = _sender
needReconnect = true
maxReConnectTimes = 5
createWs();
}
const createWs = () => {
if (!wsUrl) return;
console.log(wsUrl, 'wsUrl');
ws = new WebSocket(wsUrl);
ws.onopen = () => {
console.log('客户端连接成功');
ws.send('heart-beat')
maxReConnectTimes = 5
}
// 从服务器接受到信息的回调函数
ws.onmessage = (e) => {
console.log('收到服务器消息', e.data);
}
ws.onclose = () => {
console.log('ws.onclose: 关闭客户端连接');
reconnect()
}
ws.onerror = () => {
console.log('连接失败了准备重连');
reconnect()
}
const reconnect = () => {
if (!needReconnect) return console.log('连接断开,无需重连');
// 重连时如果ws还存在需要关闭socket
if (ws !== null) {
ws.close();
}
// 加一个重连的锁,如果重复连接时只能使用第一次连接
if (lockReConnect) return;
lockReConnect = true;
if (maxReConnectTimes > 0) {
console.log(`准备重连,剩余重连次数: ${maxReConnectTimes}`, new Date().getTime());
maxReConnectTimes--;
// 设置定时5S重连一次
setTimeout(() => {
createWs();
lockReConnect = false
}, 5000);
} else {
console.log('连接已经超时');
}
}
// 需要不停的发心跳
setInterval(() => {
if (ws && ws.readyState == 1) {
console.log('发送心跳');
ws.send("heart beat")
}
}, 5000);
}
const closeWs = () => {
needReconnect = false
ws.close();
}
export {
initWs,
closeWs
}
Electron: 使用ws(websocket)进行长链接
于 2024-11-21 09:18:09 首次发布