websocket心跳及重连机制

React中项目需要使用websockt的重连机制

useEffect(() => {
    let webSocket = null;
    let lockReconnect = false; // 是否真正建立连接
    let timeout = 20 * 1000; // 20秒一次心跳,可更改实际需求需要的时间
    let timeoutObj = null; 
    let serverTimeoutObj = null;
    let timeoutNum = null;
    const start = () => { // 开启心跳
      timeoutObj && clearTimeout(timeoutObj);
      // serverTimeoutObj && clearTimeout(serverTimeoutObj);
      timeoutObj = setTimeout(function () {
        if (webSocket.readyState === 1) {//连接正常
          webSocket.send('hello');
        } else {
          reconnect();
        }
        // serverTimeoutObj = setTimeout(function () {
        //   // 超时关闭
        //   webSocket.close();
        // }, timeout);
      }, timeout)
    };
    const reset = () => { // 重置心跳
      // 清除时间
      clearTimeout(timeoutObj);
      // clearTimeout(serverTimeoutObj);
      // 重启心跳
      start();
    };
    const reconnect = () => { // 重新连接
      console.log('reconnect', lockReconnect);
      if (lockReconnect) {
        return;
      };
      lockReconnect = true;
      // 没连接上会一直重连,设置延迟避免请求过多
      timeoutNum && clearTimeout(timeoutNum);
      timeoutNum = setTimeout(function () {
        // 新连接
        initWebSocket();
        lockReconnect = false;
      }, 5000);
    };
    const initWebSocket = () => {
      webSocket = new WebSocket('ws://***********');
      webSocket.onopen = () => {
        console.log('open...');
        start();
      };
      webSocket.onclose = () => {
        console.log('close...');
        reconnect();
      };
      webSocket.onerror = () => {
        console.log('error...');
        // reconnect();
      };
      webSocket.onmessage = (result) => {
        const { data } = result;
        reset();
        if (data === 'new connection into') {
          console.log('data---', data);
          return;
        }
        const msg = JSON.parse(data);
        console.log('获取的数据', msg)
        }
      };
    };
    initWebSocket();
    return () => {
      webSocket.close();
    };
  }, []);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值