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弹出窗口居前显示的实现方法
Jul 10 Javascript
用jquery实现的一个超级简单的下拉菜单
May 18 Javascript
Google Maps API地图应用示例分享
Oct 23 Javascript
js实现下拉框选择要显示图片的方法
Feb 16 Javascript
jquery实现触发时更新下拉列表内容的方法
Dec 02 Javascript
Angularjs 1.3 中的$parse实例代码
Sep 14 Javascript
vue兄弟组件传递数据的实例
Sep 06 Javascript
Vue自定义指令写法与个人理解
Feb 09 Javascript
jsonp实现百度下拉框功能的方法分析
May 10 Javascript
微信小程序本地存储实现每日签到、连续签到功能
Oct 09 Javascript
JS window对象简单操作完整示例
Jan 14 Javascript
JavaScript实现横版菜单栏
Mar 17 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
PHPShop存在多个安全漏洞
2006/10/09 PHP
实用函数3
2007/11/08 PHP
PHP set_error_handler()函数使用详解(示例)
2013/11/12 PHP
php去除换行(回车换行)的三种方法
2014/03/26 PHP
thinkphp,onethink和thinkox中验证码不显示的解决方法分析
2016/06/06 PHP
php微信开发之图片回复功能
2018/06/14 PHP
PHP基于mcript扩展实现对称加密功能示例
2019/02/21 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
javaScript复制功能调用实现方案
2012/12/13 Javascript
引用外部脚本时script标签关闭的写法
2014/01/20 Javascript
node.js中的console.time方法使用说明
2014/12/09 Javascript
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
angular2使用简单介绍
2016/03/01 Javascript
表单元素值获取方式js及java方式的简单实例
2016/10/15 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
2017/03/14 Javascript
ES6新特性二:Iterator(遍历器)和for-of循环详解
2017/04/20 Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
2017/11/22 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
NodeJs form-data格式传输文件的方法
2017/12/13 NodeJs
vue自动化表单实例分析
2018/05/06 Javascript
nodejs初始化init的示例代码
2018/10/10 NodeJs
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
微信小程序中的上拉、下拉菜单功能
2020/03/13 Javascript
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
Django项目中包含多个应用时对url的配置方法
2018/05/30 Python
softmax及python实现过程解析
2019/09/30 Python
解决pytorch报错:AssertionError: Invalid device id的问题
2020/01/10 Python
Python实现给PDF添加水印的方法
2021/01/25 Python
监理员的岗位职责
2013/11/13 职场文书
幼儿园老师寄语
2014/04/03 职场文书
2014年保安个人工作总结
2014/11/13 职场文书
Redis入门教程详解
2021/08/30 Redis