首页 > 其他分享 >vue2 + websocket 断线重连 + 实时数据

vue2 + websocket 断线重连 + 实时数据

时间:2023-10-17 09:33:04浏览次数:39  
标签:function websocket reconnect self ws vue2 msg 重连 连接

一、websocket事件

  -1 打开事件

    Socket.onopen 连接建立时触发

  -2 消息事件

    Socket.onmessage 客户端接收服务端数据时触发

  -3 错误事件

    Socket.onerror 通信发生错误时触发

  -4 关闭事件

    Socket.onclose 连接关闭时触发

二、websocket方法

  -1 发送数据(注 - 只有在连接打开时才可以发送消息。)

    Socket.send() 使用连接发送数据

  -2 关闭连接

    Socket.close() 关闭连接  【代表握手再见,它完全终止连接,在重新建立连接之前不能传输任何数据。】

 

三、实现websocket 断线重连 和 实时更新数据

 // 创建
    wsConnect() {
      /**
       * 重连时这里要重新将实例交给ws
       * 1.发布订阅监听
       * 2.直接传
       */
   
     var lockReconnect = false; //避免ws重复连接
      var ws = null; // 判断当前浏览器是否支持WebSocket
      var wsUrl = `ws://192.168.0.33:8686/ws?uid=${this.userId}`;  //后端的ws接口
      createWebSocket(wsUrl); //连接ws

      function createWebSocket(url =  `ws://192.168.0.33:8686/ws?uid=${this.userId}`) {
        try {
          if ("WebSocket" in window) {
            ws = new WebSocket(url);
          }
          initEventHandle();
        } catch (e) {
          reconnect(url);
          console.log(11, e);
        }
      }

      const self = this;
      function initEventHandle() {
        ws.onclose = function (msg) {
          reconnect(wsUrl);
          console.log("llws连接关闭!" + new Date().toLocaleString());
        };
        ws.onerror = function (msg) {
          reconnect(wsUrl);
        };
        ws.onopen = function (msg) {
          heartCheck.reset().start(); //心跳检测重置
          console.log("llws连接成功!" + new Date().toLocaleString());
        };
        ws.onmessage = (msg) => {
          //如果获取到消息,心跳检测重置
          heartCheck.reset().start(); //拿到任何消息都说明当前连接是正常的
          let data = JSON.parse(msg.data);
          console.log(22,data);
          // 变动值 (注意this指向)
          self.newnumber=data.countScore
          self.push=data
          // self.leaderboard.sort((a, b) => b.countScore - a.countScore);
        };

        // 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
        window.onbeforeunload = function (msg) {
          console.log("222", msg);
          ws.close();
        };

        function reconnect(url) {
          if (lockReconnect) return;
          lockReconnect = true;
          setTimeout(function () {
            //没连接上会一直重连,设置延迟避免请求过多
            createWebSocket(url);
            lockReconnect = false;
          }, 2000);
        }

        //心跳检测
        var heartCheck = {
          timeout: 2000, //2000发一次心跳
          timeoutObj: null,
          serverTimeoutObj: null,
          reset: function () {
            clearTimeout(this.timeoutObj);
            clearTimeout(this.serverTimeoutObj);
            return this;
          },
          start: function () {
            var self = this;
            this.timeoutObj = setTimeout(function () {
              //这里发送一个心跳,后端收到后,返回一个心跳消息,
              //onmessage拿到返回的心跳就说明连接正常
              ws.send("ping");
              console.log("ping!");

              // self.serverTimeoutObj = setTimeout(function () {
              //   //如果超过一定时重置间还没,说明后端主动断开了
              //   ws.close(); //如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
              // }, self.timeout);
            }, this.timeout);
          },
        };
      }
    },

this.wsConnect()  //调用

  

注:该文档为个人理解所写,有误可建议修改

 

标签:function,websocket,reconnect,self,ws,vue2,msg,重连,连接
From: https://www.cnblogs.com/persistIn/p/17768928.html

相关文章

  • uniGUI使用WebSocket
    现在的uniGUI最新版本,经过几个版本的迭代,已经完美支持WebSocket。用起来,也非常简单,默认情况下,已经打开WebSocket。打开demos中的第一个例子: C:\ProgramFiles(x86)\FMSoft\Framework\uniGUI\Demos\Desktop\WebSocket-Basic在Main单元,可以看到:1.如何广播一个消息:BroadcastM......
  • Qt/C++编写物联网组件/支持modbus/rtu/tcp/udp/websocket/mqtt/多线程采集
    一、功能特点支持多种协议,包括Modbus_Rtu_Com/Modbus_Rtu_Tcp/Modbus_Rtu_Udp/Modbus_Rtu_Web/Modbus_Tcp/Modbus_Udp/Modbus_Web等,其中web指websocket。支持多种采集通讯方式,包括串口和网络等,可自由拓展其他方式。自定义采集间隔(精确到毫秒)和超时次数,超时后自动将离线的文件......
  • 测试springboot项目苍穹外卖,解决websocket“服务器错误,无法接收实时报警信息”问题
    使用IDEA启动springboot项目苍穹外卖后,http://localhost:8071/能够正常访问登录,但是网页右上角始终显示“服务器错误,无法接收实时报警信息”: 在网上搜索找到:https://blog.csdn.net/qq_65032048/article/details/132077097,发现可能是修改了nginx端口号为8071导致。解决办法:在n......
  • Websocket vs SSE(Server-Sent Events)
    定义Websockets和SSE(服务器发送事件)都能够将数据推送到浏览器,但它们不是竞争技术。Websockets连接既可以向浏览器发送数据,也可以从浏览器接收数据。可以使用websockets的应用程序的一个很好的例子是聊天应用程序。SSE连接只能向浏览器推送数据。在线股票报价或Twitter......
  • PHP 的 Websocket 客户端和服务器
     /*------------------------------------------------------*///--需要安装websocket,我用的是下面链接提供的//--https://github.com/Textalk/websocket-php/*------------------------------------------------------*///客户端require('vendor/autoload.php');$c......
  • 【vue2】实现css动效逐个顺序展示的效果(简陋版)
    效果(进入预约里程碑模块后,小人从第一个台阶逐个闪烁出现在当前预约等级之前的台阶并消失,最终停留在当前预约等级的台阶上): 虽然很low但是!就是这么设计的!于是在原本静态的代码上稍加了些修改(为什么,为什么,想问天问大地)首先是台阶部分的代码:<div:class="$style.reserveBox......
  • vue2常见选项和生命周期钩子函数
    Vue2提供了一些其他选项和钩子函数,以支持更高级的组件功能和配置,这些包括:data:data选项用于定义组件的响应式数据。这些数据将被Vue追踪,以便在数据发生变化时更新视图。data(){return{message:'Hello,Vue!'}}methods:methods选项用于定义组件的方法,这些方法......
  • 关于c语言操作libwebsockets示例
    第一步,安装libwebsockets库,c语言编写的,默认安装引用库,配置相应的库及路径第二步:上代码main.h ////CreatedbyAdministratoron2020/5/1.// #ifndefMEDIA_MAIN_H#defineMEDIA_MAIN_H #define boolchar volatileintexit_sig=0; #defineMAX_PAYLOAD_SIZE 10......
  • vue2 父传子,子传父
    在Vue2中,使用props来从父组件向子组件传递数据,而要从子组件向父组件传递数据,通常需要使用自定义事件。关键字分别是:从父组件向子组件传递数据(父传子):props:可以在子组件中使用props来接收父组件传递的数据。在父组件中,使用子组件标签的属性来传递数据。示例:<!--父组件--......
  • 封装利用libwebsockets写出的客户端、服务端程序为客户端服务端类
    1.封装我们后续将使用c++来开发程序,因此有必要将用c写成的wss客户端、服务端程序作进一步封装,使其成为wss客户端类和服务端类,这样更便于调用。封装后的程序结构: ubuntu@ubuntu-virtual-machine:~/work/test_libwebsockets/lws_class$tree .├──client│  ├──cl......