声明:请勿直接复制粘贴抄袭文章,若有需要,请规范转载,注明出处,谢谢!

---------------------------------------------------------------------------------------------------------

最近项目中使用到了webscoket,这个东西吧,用起来也很简单。

但是我发现,这个东西会因为网络的不稳定而断开连接,断开就断开吧,关键是断开了,webscoket不会出现异常。

于是就要自己去检测,这个有没有掉线。

我的想法是,每隔30秒向服务器发送信息,

每隔32秒去判断有没有收到消息,如果没有则判断为断开连接,进行重新连接。

因为我的技术能力还不是很强,所有代码在写法上有些不足,或许有些冗余,

但是功能的实现是没有问题的,

话不多说,上代码

export default {
data(){
return {
path:'', // WebSocket的地址
socket:'', // WebSocket实例
times:0, // 短线重新连接次数
isConn:true, // 配合次数进行自动重连
heart:0, // 接收定时器,用来检测WebScoket是否断线
Tim:0, // 用于判断是否接收消息的定时器
}
},
mounted(){
this.path = 'ws://82.157.123.54:9010/ajaxchattest'; // 测试地址,百度上可以搜索到
//this.path = 'ws://' + window.location.hostname + '/devices/history'; // 获取浏览器当前地址,因为后台ip可能不固定,如果固定可以写死,就像上面那样,但是如果ip动态,则可以使用这个,上线使用
this.Init(this.path); // 挂载时,初始化数据,建立连接等
},
methods: {
Init(path){
this.socket = new WebSocket(path); // 进行连接,连接的结果和状态在下面的onopen、onmessage、onclose
let that = this; // 因为下面使用了普通函数,存在this指向问题,所以我就把vue的当前实例给that了,that的使用和this一样,就看成this就行 this.socket.onopen = function() {
console.log("WebScoket已经成功连接!");
this.heart = setInterval(()=>{ that.socket.send('hello')},1000*30); // 每隔30秒就向服务器发送消息
that.times = 0; // 在连接成功的时候改变成初始状态,如果重连就会增加
that.isConn = true; // 同上,与上面的次数共同控制是否重连,我不可能一直尝试重连,连接几百次吧
}; this.socket.onmessage = function() { // 接收消息,触发此回调
console.log("接收到的消息为:hello");
if(that.Tim){ // 初始值为0,也就是false,第一次不会执行清理定时器
clearTimeout(that.Tim);
}
that.Tim = setTimeout(()=>{ that.socket.onclose=()=>{ that.socket.close() }; },1000*33) // 只要接收到消息就会创建一个定时器,定时器的内容是在33秒后关闭webscoket,但是如果在该时间内接收到消息,那么就会再次执行,会进入上面的if,
}; this.socket.onclose = function() {
console.log("WebScoket已经断开连接");
if(this.heart !== 0){
clearInterval(this.heart)
}
if(that.times < 5 && that.isConn){ // 每隔5秒就会重新连接,未连接成功就会次数增加,连接成功就会清零
that.isConn = false; // 在定时器结束前,不允许再次执行该函数,这里应该可以优化
setTimeout(function(){
that.times ++;
console.log(`尝试第${that.times}次重连!`)
that.isConn = true;
that.Init(that.path) // 执行尝试重新连接
},5000)
}else{
this.isConn = false; // 貌似可以优化
this.socket.close(); // 彻底关闭
}
}; this.socket.onerror = function() { // 这个删了也不会报错
console.log('WebSocket连接发生异常!'); };
},
}
}

逻辑其实很简单,就是有一点绕,声明的变量稍微有点多,看懂了还是很简单,

这些变量就像是一堆水龙头,它是否放水,得要判断,并且在不同的时候,给它不同的值。

如果不想搞懂也可以直接拿来用,关于时间地址改改就能用!

-----------------------------------------------------------------------------------------------------------------

测试的话,需要在vue文件里面写,打开控制台,然后断网联网模拟真实情况,就可以调试了

结果

(报错是因为我手动开关了wifi,尝试重连没有问题,最后稳定连接,对接收消息判断,也没有问题!)

关于在Vue中使用WebScoket的随笔的更多相关文章

  1. Vue中的render函数随笔

    使用vue-cli创建项目后,再main.js里面有这样一段代码: new Vue({ render:h => h(App) }).$mount('#app') render函数是渲染一个视图, ...

  2. vue中监听window.resize的变化

    我只想说每个人遇到的bug真的不能一概而论,解决办法也会有不同.在vue中使用echarts的时候,会想要实现window.resize窗体变化大小的时候让图形大小跟着变化.实现的过程中各种bug,也 ...

  3. vue中websoket的使用

    首先安装npm install --save  websocket-heartbeat-js@^1.0.7 在main.js中  引入并挂载全局方法 import WebsocketHeartbeat ...

  4. vue中如何不通过路由直接获取url中的参数

    前言:为什么要不通过路由直接获取url中的参数? vue中使用路由的方式设置url参数,但是这种方式必须要在路径中附带参数,而且这个参数是需要在vue的路由中提前设置好的. 相对来说,在某些情况下直接 ...

  5. vue中的重要特性

    一.vue中的自定义组件 html的代码: <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  6. Vue中comoputed中的数据绑定

    Vue中的数据实现响应式绑定是在初始化的时候利用definePrototype的定义set和get过滤器,在进行组件模板编译时实现water的监听搜集依赖项,当数据发生变化时在set中通过调用dep. ...

  7. vue中使用stompjs实现mqtt消息推送通知

    最近在研究vue+webAPI进行前后端分离,在一些如前端定时循环请求后台接口判断状态等应用场景用使用mqtt进行主动的消息推送能够很大程度的减小服务端接口的压力,提高系统的效率,而且可以利用mqtt ...

  8. Vue中应用CORS实现AJAX跨域,及它在 form data 和 request payload 的小坑处理

    基本概念部分(一):理解CORS 说道Vue的跨域AJAX,我想先梳理一遍CORS跨域,"跨域资源共享"(Cross-origin resource sharing),它是一个W3 ...

  9. vue中watched属性

    watched属性,vue中的观察属性,可用来监听一个值的变化 默认有两个参数,新值,旧值 data (){ return { currentCity: "深圳" } } watc ...

随机推荐

  1. Spring框架源码干货分享之三级缓存和父子工厂

    记录并分享一下本人学习spring源码的过程,有什么问题或者补充会持续更新.欢迎大家指正! 环境: spring5.X + idea 建议:学习过程中要开着源码一步一步过 Spring中对象的创建宏观 ...

  2. CTF靶场

    CTF靶场测试报告 一.跨站脚本攻击(XSS) 实验原理:跨站脚本攻击( Cross Site Script),本来的缩写应为CSS,但是为了与层叠样式表(Cascading Style CSS)区分 ...

  3. mysql--求中位数

    第一种求中位数方法: /* 第一步:添加一个正序和反序 第二步:当列表数目为奇数的时候,列表选出的情况,当列表为偶数的时候列表的情况 第三步:统筹奇数和偶数时中位数 */ select sum(Mat ...

  4. time_formatter(uaf)

    拿到题目先例行检查 然后进入主函数查看程序流程, 进入函数 这些字符串对我们选择1的输入进行了限制 在输入里面,可以看到strdup这个关键性的函数 调用了malloc这个函数 在选择四里面,可以看到 ...

  5. LET函数(Excel函数集团)

    LET函数,是个Office365新增函数,所以,还在用上古版本的童鞋请无视此篇哈~ 话说Excel中,有个自定义名称的功能,如下图,左右两个表分别自定义了"data1"和&quo ...

  6. Docker从入门到精通(七)——容器数据共享

    什么是容器数据共享?简单来说就是容器与容器之间数据共享,容器与宿主机数据共享. 1.为什么需要数据共享? ①.数据持久化 比如我们有一个MySQL集群,通过容器启动,那么项目运行过程中的数据是保存在容 ...

  7. LuoguP7072 [CSP-J2020] 直播获奖 题解

    Update \(\texttt{2020.11.13}\) 修改了一个小细节. \(\texttt{2020.11.16}\) 修改了一个错误. Content 有一场 \(n\) 个人的比赛,计划 ...

  8. shell脚本报错:.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录

    .sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录 这是因为shell脚本是Windows下编辑的 格式不一样 执行 sed -i 's/\r$//' 脚本名称.sh

  9. 【LeetCode】118. Pascal's Triangle 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 [LeetCo ...

  10. 【转】最短路径——Dijkstra算法和Floyd算法

    [转]最短路径--Dijkstra算法和Floyd算法 标签(空格分隔): 算法 本文是转载,原文在:最短路径-Dijkstra算法和Floyd算法 注意:以下代码 只是描述思路,没有测试过!! Di ...