Vue通过WebSocket建立长连接的实现代码


Posted in Javascript onNovember 05, 2019

使用场景:

在项目开发中,后端需要处理一连串的逻辑,或者等待第三方的数据返回来进行处理之后在返回给前端,可能时间会很长,而且前端也不知道后端什么时候能处理好(时间长的话会达到10分钟左右),如果采用普通的HTTP连接,前后端无法一直保持联系,麻烦的时候可能还需要采用轮询的机制,所以使用WebSocket连接效果还是比较好的。

使用时间:

在界面加载完之后,建上WebSocket连接,此时前端还可以发送普通的HTTP的请求,等到后端处理完之后,通过建立的WebSocket连接返给前端,前端根据返回的数据进行对应的操作。

代码展示:

<template>
</template>
<script>
export default {
 data() {
  return{
   // 用户Id
   userId:'',
   appid:'',
   // 事件类型
   type:'',
   msg:'',
   wsUrl:''
  }  
 },
 methods: {
  //初始化weosocket
  initWebSocket() {
   if (typeof WebSocket === "undefined") {
    alert("您的浏览器不支持WebSocket");
    return false;
   }
   const wsuri = 'ws://(后端WebSocket地址)/websocket/' + this.userId + '/' + this.appid // websocket地址
   this.websock = new WebSocket(wsuri);
   this.websock.onopen = this.websocketonopen;
   this.websock.onmessage = this.websocketonmessage;
   this.websock.onerror = this.websocketonerror;
   this.websock.onclose = this.websocketclose;
  },
  //连接成功
  websocketonopen() {
   console.log("WebSocket连接成功");
   // 添加心跳检测,每30秒发一次数据,防止连接断开(这跟服务器的设置有关,如果服务器没有设置每隔多长时间不发消息断开,可以不进行心跳设置)
   let self = this;
   this.timer = setInterval(() => {
    try {
     self.websock.send('test')
     console.log('发送消息');
    }catch(err){
     console.log('断开了:' + err);
     self.connection()
    }
   }, 30000)
  },
  //接收后端返回的数据,可以根据需要进行处理
  websocketonmessage(e) {
   var vm = this;
   let data1Json = JSON.parse(e.data);
   console.log(data1Json);
  },
  //连接建立失败重连
  websocketonerror(e) {
   console.log(`连接失败的信息:`, e);
   this.initWebSocket(); // 连接失败后尝试重新连接
  },
  //关闭连接
  websocketclose(e) {
   console.log("断开连接", e);
  }
 },
 created() {
  if (this.websock) {
   this.websock.close(); // 关闭websocket连接
  }
  this.initWebSocket();
 },
 destroyed() {
  //页面销毁时关闭ws连接
  if (this.websock) {
   this.websock.close(); // 关闭websocket
  }
 }
};
</script>

问题回顾:

在实际使用的时候遇到的问题:有的时候页面链接还没有建立上,但是后端已经把数据都处理好了,这个时候推给前端,前端接收不到。

解决方案:

1)简单的方法:让后端延迟几秒再推

优势:简单

劣势:降低了性能

2)优化之后的方法:使用Redis保存用户的登录状态,缓存这个用户的数据,等到建立连接之后再推,推完就清空Redis

总结

以上所述是小编给大家介绍的Vue通过WebSocket建立长连接的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
JS阻止用户多次提交示例代码
Mar 26 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
May 22 Javascript
javascript结合fileReader 实现上传图片
Jan 30 Javascript
详解js图片轮播效果实现原理
Dec 17 Javascript
jQuery解析XML 详解及方法总结
Sep 28 Javascript
js根据需要计算数组中重复出现某个元素的个数
Jan 18 Javascript
vue iview多张图片大图预览、缩放翻转
Jul 13 Javascript
layui点击数据表格添加或删除一行的例子
Sep 12 Javascript
javascript实现计算器功能
Mar 30 Javascript
Openlayers学习之加载鹰眼控件
Sep 28 Javascript
vscode+gulp轻松开发小程序的完整步骤
Oct 18 Javascript
如何制作自己的原生JavaScript路由
May 05 Javascript
原生js实现随机点名功能
Nov 05 #Javascript
element-ui 文件上传修改文件名的方法示例
Nov 05 #Javascript
vue keep-alive 动态删除组件缓存的例子
Nov 04 #Javascript
javascript如何实现create方法
Nov 04 #Javascript
关于vue里页面的缓存详解
Nov 04 #Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
Nov 04 #Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
Nov 04 #Javascript
You might like
php判断字符以及字符串的包含方法属性
2008/08/30 PHP
PHP操作MySQL事务实例
2014/11/05 PHP
通过event对象的fromElement属性解决热区设置主实体的一个bug
2008/12/22 Javascript
关于JS管理作用域的问题
2013/04/10 Javascript
jQuery多个input求和的实现方法
2015/02/12 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
2015/12/03 Javascript
javascript实现的上下无缝滚动效果
2016/09/19 Javascript
ajax级联菜单实现方法实例分析
2016/11/28 Javascript
node.js调用Chrome浏览器打开链接地址的方法
2017/05/17 Javascript
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
[50:17]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[02:23]1个至宝=115个英雄特效 最“绿”至宝拉比克“魔导师密钥”登场
2018/12/29 DOTA
用python实现面向对像的ASP程序实例
2014/11/10 Python
python使用Image处理图片常用技巧分析
2015/06/01 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
如何用Python实现简单的Markdown转换器
2018/07/16 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
python如何实现异步调用函数执行
2019/07/08 Python
python检测服务器端口代码实例
2019/08/31 Python
Python中import导入不同目录的模块方法详解
2020/02/18 Python
领导失职检讨书
2014/02/24 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
开业典礼主持词
2014/03/21 职场文书
施工单位安全责任书
2014/07/24 职场文书
合同意向书范本
2014/07/30 职场文书
乡镇民主生活会发言材料
2014/10/20 职场文书
教师节感谢信
2015/01/22 职场文书
《称赞》教学反思
2016/02/17 职场文书
入伍志愿书怎么写?
2019/07/19 职场文书
导游词之舟山普陀山
2019/11/06 职场文书
mybatis源码解读之executor包语句处理功能
2022/02/15 Java/Android