位置: IT常识 - 正文

vue项目使用websocket连接问题及解决(vue项目使用less)

编辑:rootadmin
这篇文章主要介绍了vue项目使用websocket连接问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 目录

推荐整理分享vue项目使用websocket连接问题及解决(vue项目使用less),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue项目使用less,vue项目使用markdown语法,vue项目使用d3.js实现思维导图,vue项目使用less,vue项目使用less,vue项目使用svg图标,vue项目使用svg图标,vue项目使用svg图标,内容如对您有帮助,希望把文章链接给更多的朋友!

vue使用websocket连接前景解决过程vue2全局使用websocket记录新建ws模块文件在main.js中引用ws模块文件App.vue挂载时再次连接服务器并且接收消息vue使用websocket连接前景

公司做一个包含websocket的项目,我用的是vue做的,开始只有一个组件的要求demo,就将websocket的配置直接放在组件方法中,组件挂载时直接初始化ws,但是后续组件增加,开始出现多个websocket链接的情况,是不允许的。

刚开始的做法是将websocket的方法配置等封装为一个js文件给各个组件调用,当离开组件页面进入新页面时会断连旧的ws新建一个ws,以为做到了独立,但是实际上确实多次的断连链接,十分不便。

思考了挺久找到了解决方法,在此记录加深记忆

解决过程

要求整个vue项目使用一个ws链接,在各组件都要求可以接受发送消息

首先想到的就是在app.vue下创建我是链接,然后给各个小的组件使用ws,做到统一,很简单的解决思路,我是这么做的

前期已经将ws封装成一个wsconnect.js文件了,那么是否可以将wsconnect注册为全局的方法呢,试了一下果真可行,只需要在main.js中配置:

import wsConnect from "@/assets/js/wsConnect";Vue.prototype.$ws = wsConnect new Vue({  render: h => h(App),  router,  axios,  store}).$mount('#app')vue项目使用websocket连接问题及解决(vue项目使用less)

说明一下,在wsconnect.js文件中我封装了方法,但是把ws对象放在了vuex的state中,相关配置如下:

wsconnect.js:

import axios from "axios";import store from "@/store"; //websocket function initWebpack(){    var url = store.state.url    var wsurl = ''    axios.get(`${url}/bcall/url`)  //这是我在从后端拿ws链接的地址        .then((res) =>  {            console.log(res.data.data)            wsurl = res.data.data            store.state.ws = new WebSocket(wsurl);            store.state.ws.onopen = onopen;            store.state.ws.onmessage = onmessage;            store.state.ws.onclose = onclose;            store.state.ws.onerror = onerror;         }).catch((err)=> {        console.log(err)    }) }function onopen() {    console.log("连接websocket");    var params = '{"reqtype":"Query","action":"allexts"}'    store.state.ws.send(params)    start();}function reconnect() {//重新连接    var that = store.state;    if(that.lockReconnect) {        return;    }    that.lockReconnect = true;    //没连接上会一直重连,设置延迟避免请求过多    that.timeoutnum && clearTimeout(that.timeoutnum);    that.timeoutnum = setTimeout(function () {        //新连接        initWebpack();        that.lockReconnect = false;        that.isFirstGet = true    },5000);}function reset(){//重置心跳    var that = store.state;    //清除时间    clearTimeout(that.timeoutObj);    clearTimeout(that.serverTimeoutObj);    //重启心跳    start();}function start(){ //开启心跳    console.log('开启心跳');    var self = store.state;    self.timeoutObj && clearTimeout(self.timeoutObj);    self.serverTimeoutObj && clearTimeout(self.serverTimeoutObj);    self.timeoutObj = setTimeout(function(){        //这里发送一个心跳,后端收到后,返回一个心跳消息,        if (self.ws.readyState === 1) {//如果连接正常                        self.ws.send(heartbeat); //心跳包格式需要自己确定         }else{//否则重连            reconnect();        }        self.serverTimeoutObj = setTimeout(function() {            //超时关闭            self.ws.close();            reconnect()        }, self.timeout);    }, self.timeout)}function onmessage(e) {    console.log('接收数据',e)    //处理数据的地方    reset();}function onclose(e) {    console.log('websocket 断开: ',e); }function onerror(e) {    console.log("出现错误");    //重连    reconnect();}  export default {    initWebpack,    onmessage,    onclose,    onopen,    onerror}

store.state:

state: {        permissions: false,        url: '',        //ws参数        path: '',        ws: null,//建立的连接        lockReconnect: false,//是否真正建立连接        timeout: 58*1000,//58秒一次心跳        timeoutObj: null,//心跳心跳倒计时        serverTimeoutObj: null,//心跳倒计时        timeoutnum: null,//断开 重连倒计时     },

配置之后我在app.vue挂载之后直接初始化ws链接:

mounted() {    this.$ws.initWebpack()  }

发现是成功的,已经将ws链接上了,接着就是在各个组件测试一下发送数据的功能:

this.$store.state.ws.send(msg)

神奇的发现,也成功了!

之所以这么简单,前期的封装也是占功劳的嘛,至此我的vue只需要一个ws链接就可以供整个项目使用,虽然不知道别人的做法是怎么样,如果有更好的方法也希望大家讲解下

vue2全局使用websocket记录

1、考虑到登录之后要始终连接服务器接收消息,所以把websocket实例对象作为模块抛出,在main.js中引入,使全局都可以获得ws并且使用相关方法。

2、由于刷新页面时,ws会自动断开连接,所以在App.vue组件挂载时再次连接服务器。

新建ws模块文件

该文件位置任意,引入的时候注意路径即可

export default {    ws: {},    setWs: function(newWs) {        this.ws = newWs    },    start(){// 发送心跳        clearInterval(this.timeoutObj)        this.timeoutObj = setInterval(() => {            if (this.ws && this.ws.readyState == 1) {                console.log('发送心跳')                this.ws.send(JSON.stringify({                    //后端需要接收的数据                }));            }        }, 10 *1000)//十秒发一次    },    localSocket(userId) {//连接ws,根据连接服务器是否需要参数设置该方法是否需要接收参数        if ("WebSocket" in window) {            // console.log("您的浏览器支持 WebSocket!");            // location.host            this.ws = new WebSocket('这里要填连接服务器的地址');            this.setWs(this.ws);            this.ws.onopen = ()=>{                console.log('websocket连接成功');                //连接上之后要发心跳包                this.start()            };            this.ws.onclose = function () {                // 关闭 websocket                console.log("连接已关闭...");                //断线重新连接                setTimeout(() => {                    this.localSocket(userId);                }, 2000);            };        } else {            // 浏览器不支持 WebSocket            console.log("您的浏览器不支持 WebSocket!");            this.openNotificationWithIcon('error', '浏览器', '您的浏览器不支持显示消息请更换', 1,1)        }    },} 在main.js中引用ws模块文件import global from './ws.js'Vue.prototype.global = globalApp.vue挂载时再次连接服务器并且接收消息mounted(){      this.global.localSocket(userId)      //连上之后要接收服务器发来的消息      this.global.ws.onmessage = (msg)=>{          console.log(JSON.parse(msg.data))       }}

通过以上方法,任何组件都可以通过this.global.ws获得websocket实例对象并且使用相关方法,可能会有些问题,但是我别的问题太多了,这个先放一下吧。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。

本文链接地址:https://www.jiuchutong.com/zhishi/304569.html 转载请保留说明!

上一篇:Vue如何给组件添加点击事件 @click.native(vue组件怎么使用)

下一篇:“小三”英语怎么说?难道要说“little three”?!(小三用英语怎么写?)

  • 百度统计报告对数据统计的价值(百度统计好用吗)

    百度统计报告对数据统计的价值(百度统计好用吗)

  • 163免费邮箱注册版(163免费邮箱注册)(163免费邮箱)

    163免费邮箱注册版(163免费邮箱注册)(163免费邮箱)

  • 手机MAC地址怎么查(手机MAC地址怎么查苹果)

    手机MAC地址怎么查(手机MAC地址怎么查苹果)

  • 蚂蚁借呗关闭(蚂蚁借呗关闭后征信上还有记录吗)

    蚂蚁借呗关闭(蚂蚁借呗关闭后征信上还有记录吗)

  • 华为荣耀9xpro有没有录屏功能(荣耀9xpro使用说明)

    华为荣耀9xpro有没有录屏功能(荣耀9xpro使用说明)

  • 云端照片怎么恢复到相册(云端照片怎么恢复到相册苹果手机)

    云端照片怎么恢复到相册(云端照片怎么恢复到相册苹果手机)

  • 人脸识别双胞胎能识别吗(人脸识别双胞胎能打开手机吗)

    人脸识别双胞胎能识别吗(人脸识别双胞胎能打开手机吗)

  • 淘宝与天猫有什么区别(淘宝天猫有什么特点)

    淘宝与天猫有什么区别(淘宝天猫有什么特点)

  • oppor15梦境版和标准版的区别(oppor15梦境版和标准版的屏幕通用吗)

    oppor15梦境版和标准版的区别(oppor15梦境版和标准版的屏幕通用吗)

  • 钉钉电脑版可以看见密聊是谁吗(钉钉电脑版可以看到工资条吗)

    钉钉电脑版可以看见密聊是谁吗(钉钉电脑版可以看到工资条吗)

  • 摄像头2.8mm4mm6mm有什么区别(摄像头2.8mm4mm6mm8mm有什么区别)

    摄像头2.8mm4mm6mm有什么区别(摄像头2.8mm4mm6mm8mm有什么区别)

  • iphone快充多少w(iphone快充要多少w)

    iphone快充多少w(iphone快充要多少w)

  • 苹果手机有私密空间吗(苹果手机有私密文件吗)

    苹果手机有私密空间吗(苹果手机有私密文件吗)

  • 显示器开机后亮几秒灭(显示器开机后亮一会就灭了橙色的灯)

    显示器开机后亮几秒灭(显示器开机后亮一会就灭了橙色的灯)

  • 左连接和右连接的区别(左连接和右连接的分别解决什么问题)

    左连接和右连接的区别(左连接和右连接的分别解决什么问题)

  • id号怎么查(学生id号怎么查)

    id号怎么查(学生id号怎么查)

  • 计算机二级excel常用函数公式(计算机二级excel真题)

    计算机二级excel常用函数公式(计算机二级excel真题)

  • 华为手机隐藏录屏悬浮(华为手机隐藏录屏标识)

    华为手机隐藏录屏悬浮(华为手机隐藏录屏标识)

  • win7系统开机显示英文(win7开机显示启动项)

    win7系统开机显示英文(win7开机显示启动项)

  • 小度在家怎么用(小度在家怎么用手机看监控)

    小度在家怎么用(小度在家怎么用手机看监控)

  • 苏宁如何分期(苏宁如何分期购买手机)

    苏宁如何分期(苏宁如何分期购买手机)

  • 一维信号的频域特征分析python(一维频率分布表)

    一维信号的频域特征分析python(一维频率分布表)

  • php生成用户密码的两种方法(php 用户)

    php生成用户密码的两种方法(php 用户)

  • Windows批处理实现邮件远程控制电脑(第三方批处理)(window批处理文件)

    Windows批处理实现邮件远程控制电脑(第三方批处理)(window批处理文件)

  • 计提城建税怎么算
  • 小规模纳税人免税会计分录
  • 租土地使用权建房
  • 金税四期对企业的风险
  • 商贸公司成本大吗
  • 养老保险滞纳金最高限额规定
  • 退还押金怎么做账
  • 公司购买的打印机
  • 2019未达起征点免税分录
  • 企业年报 工商
  • 挖掘机要交多少个人所得税
  • 个人社保由单位承担的可以进福利费吗
  • 子公司注销应收母公司往来款
  • 三证合一后银行开户许可证还有吗
  • 本月无凭证需要结转吗
  • 未分配利润如何使用投入生产
  • 商品流通企业的资金循环
  • 会计职业道德的作用
  • 销售肉制品税率
  • 预缴的附加税还可以扣减吗
  • 出售不动产分录
  • 母公司并购子公司需要股东会决议吗
  • 去年的成本今年入账会计分录
  • 未开票收入跨年可以冲回吗
  • 捐赠视同销售为什么不确认收入?
  • 限制浏览器打开网页
  • php操作json文件
  • php匹配邮箱
  • linux mint 20.1安装
  • 股票期权行权的基本每股收益怎么算
  • .fas文件病毒
  • 材料成本差异如何做账
  • 一亩地是多少平方?
  • 企业收到对外投资收益交所得税吗
  • 国税代开普票能作废吗
  • cjzc框架
  • 网页单行文本框
  • opencv 边缘检测
  • 应收票据包括哪些项目内容
  • 个体户按季申报吗
  • 进项发票无法取消怎么办
  • 当月计提的公积金怎么取
  • 个人所得税申报流程图
  • 公积金怎么推出工资
  • 什么叫做有限循环小数
  • 一般纳税人的劳务公司的税率
  • 小规模纳税人是季度报税吗
  • 成本法的处置
  • 进口ddp税款如何缴纳
  • 财务费用减少记借方还是贷方
  • 固定资产报废的账务处理
  • 开具的增值税专用发票上注明的价款含税吗
  • 期末调汇汇兑损益科目
  • 工资费用核算的原始记录有
  • 会计报表怎么算
  • 企业暂估入账的税务风险
  • 机票行程单改签费抵扣 税务局
  • 企业会计档案由谁保管
  • 无工资支出企业账务处理
  • 资本增值率计算公式是什么?
  • windows xp远程控制
  • 利用windows资源管理
  • 如何打开和关闭HMB
  • linux系统安装程序
  • Android自定义对话框
  • unity热更新一般更新什么
  • java物流管理系统
  • nodejs链接mysql
  • Nodejs事件循环机制图解
  • unity怎么新建项目
  • nodejs thrift
  • 完美世界打斗
  • jquery日历插件代码
  • python图片验证码输入错误不能点登陆
  • 自然人申报密码丢失如何找回
  • 车船税是电子版的怎么年检
  • 电子税务局开的发票怎么作废
  • 重庆轨道第五轮19号线路
  • 什么是契税发票?
  • 车船税发票丢了怎么补办
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设