当前位置: 首页 > news >正文

【网络通信】websocket如何断线重连

Vue

<template>
  <div>
    <button @click="sendDevName('xxxxxxxx')">发送</button>
    {{data}}
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data () {
    return {
      data: null
    }
  },
  // html加载完成后执行initWebSocket()进行websocket初始化
  mounted () {
    this.initWebSocket()
  },
  // 离开该层时执行,划重点了!!!
  destroyed: function () {
    // 离开路由之后断开websocket连接
    this.websock.close()
  },
  methods: {
    // 初始化websocket
    initWebSocket () {
      const path = 'ws://xxx.xxx.xxx.xxx:端口号/xxxxx'// 后台给的websocket的ip地址
      this.websock = new WebSocket(path)
      this.websock.onmessage = this.websocketOnMessage
      this.websock.onopen = this.websocketOnOpen
      this.websock.onerror = this.websocketOnError
      this.websock.onclose = this.websocketClose
    },
    // 连接建立成功的信号
    websocketOnOpen () {
      console.log('初始化成功')// 连接成功后就可以在这里写一些回调函数了
    },
    // 连接建立失败重连
    websocketOnError () {
      // 如果报错的话,在这里就可以重新初始化websocket,这就是断线重连
      this.initWebSocket()
    },
    // 数据接收
    websocketOnMessage (e) {
      console.log(e)// e这个变量就是后台传回的数据,在这个函数里面可以进行处理传回的值
      this.data = e// 这边我绑定了一个data,data会在网页上显示后端传来的东西
    },
    // 数据发送
    websocketSend (Data) {
      this.websock.send(Data)// Data变量就是你想对后台说些啥,根据后端给你的接口文档传值进行交互
    },
    // 关闭的信号
    websocketClose () {
      console.log('断开连接')
    },
    // 传参给后端,这里对websocketSend又进行了一层封装,用不到的可以删除
    sendDevName (chooseDevice) {
      console.log(chooseDevice)
      this.websocketSend(chooseDevice)
    }
  }
}
</script>

前端点击“发送”后端服务器就会接受到马赛克里面的东西
在这里插入图片描述前端点击发送按钮触发websocketSend (Data)函数后端就会收到前端发的消息,根据前端传过来的消息再发送前端所需要的信息,前端一旦监听到有东西发过来就会触发websocketOnMessage (e)这个函数

websocket的状态

ebsocket的两个属性:readyState和bufferedAmount。
根据readyState属性可以判断webSocket的连接状态,该属性的值可以是下面几种:
0 :对应常量CONNECTING (numeric value 0),
正在建立连接连接,还没有完成。The connection has not yet been established.
1 :对应常量OPEN (numeric value 1),
连接成功建立,可以进行通信。The WebSocket connection is established and communication is possible.
2 :对应常量CLOSING (numeric value 2)
连接正在进行关闭握手,即将关闭。The connection is going through the closing handshake.
3 : 对应常量CLOSED (numeric value 3)
连接已经关闭或者根本没有建立。The connection has been closed or could not be opened.
例:
var socket = new WebSocket(url);
if(socket.readyState!=1){
alert(“未连接。”);
return;
}
根据bufferedAmount可以知道有多少字节的数据等待发送,若websocket已经调用了close方法则该属性将一直增长。

Js

首先我们要熟悉如下几个api

1、连接websocket的服务器的websocekt函数

2、websocekt断开后触发的onclose函数

由上面这两个函数就可以了,大致思路梳理一下:

1、首先开发一个函数websocketinit,函数主要是websocket的连接逻辑,监听信息,发送信息

2、监听onclose事件,onclose触发后重新执行websocketinit事件

思路有了大致代码如下:

  function webSocketInit(service){
   //1、初始化ws
   //2、监听onclose事件 重新执行websocketInit函数
  }

具体代码如下:

//1.创建websocket客户端
var host = window.location.host; #IP
var ut = "{{ ut }}";
var wsServer = 'wss://' + host + '/notify/wxlogin?ut=' + ut;

var timeConnect = 0;
webSocketInit(wsServer);

//socket初始化
function webSocketInit(service) {
    var ws = new WebSocket(service);
    ws.onopen = function () {
        console.log("已连接TCP服务器");
        ws.send('Hello WebSockets!');

    };
    ws.onmessage = function (evt) {
        console.log('Received Message: ' + evt.data);

        data = JSON.parse(evt.data);
        console.log(data);
        if (data.status != 0) {
            alert("扫码错误");
            ws.close();
        }
        if (data.data.wx_login == 1) {
            //window.location.href = "http://" + host + "/admin"
            window.location.href = "/admin"

        }
        if (data.data.wx_login == 0) {
            //alert(data.data.message)
            $(".qr_code").css("display", "none");
            $(".tips").text(data.data.message)

        }
        console.log(data.data);
    };

    ws.onclose = function () {
        console.log('服务器已经断开');
        reconnect(service);
    };
}

// 重连
function reconnect(service) {
    // lockReconnect加锁,防止onclose、onerror两次重连
    timeConnect++;
    console.log("第" + timeConnect + "次重连");
    // 进行重连
    setTimeout(function () {
        webSocketInit(service);
    }, 1000);

}


// 心跳 * 回应
setInterval(function () {
    var websocket = new WebSocket(wsServer);
    websocket.send('');

}, 1000 * 100)

来源

vue实现websocket断线重连
websocket断线重连的方法

相关文章:

  • T Chat 第九期「 李泽磊 - 我在百度做阅读器 」9 月 1 日晚 8 点开播
  • Git从入门到项目实战,一篇文章吃透Git
  • 1.5-36:计算多项式的值
  • uniapp 学习笔记二十一 路由跳转及产品详情数据渲染
  • 怎么预防鸡葡萄球菌病 防治鸡球菌病的特效药
  • 阿里巴巴中国站1688按关键词搜索商品api电商数据接口
  • 艺术大观杂志艺术大观杂志社艺术大观编辑部2022年第20期目录
  • 神经网络专家系统的意思,神经网络专家系统结构
  • html多图片下载方法1:<a>标签 涉及nginx
  • 基于SSM学术会议管理系统毕业设计源码061504
  • Spring——简介和IOC底层原理
  • 面试必备:《Java 最常见 200+ 面试题全面解析》
  • 安卓毕业设计选题基于Uniapp实现的鲜花购物商城
  • 运维工程师——学习路线技能图谱
  • 集合Set集合详解
  • [数据结构]链表的实现在PHP中
  • 「面试题」如何实现一个圣杯布局?
  • Django 博客开发教程 16 - 统计文章阅读量
  • Django 博客开发教程 8 - 博客文章详情页
  • ES6系统学习----从Apollo Client看解构赋值
  • Invalidate和postInvalidate的区别
  • Javascript基础之Array数组API
  • JS字符串转数字方法总结
  • python docx文档转html页面
  • TypeScript实现数据结构(一)栈,队列,链表
  • 翻译:Hystrix - How To Use
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 新版博客前端前瞻
  • 学习笔记TF060:图像语音结合,看图说话
  • 组复制官方翻译九、Group Replication Technical Details
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #QT(智能家居界面-界面切换)
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (10)STL算法之搜索(二) 二分查找
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (十)T检验-第一部分
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (算法)求1到1亿间的质数或素数
  • (一)kafka实战——kafka源码编译启动
  • (一)RocketMQ初步认识
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)甲方乙方——赵民谈找工作
  • *Django中的Ajax 纯js的书写样式1
  • .jks文件(JAVA KeyStore)
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET 解决重复提交问题
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .net经典笔试题
  • .net连接oracle数据库