Electron: 使用ws(websocket)进行长链接

// 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
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值