位置: 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”?!(小三用英语怎么写?)

  • 电脑新建文件夹如何改名字(电脑新建文件夹怎么发送到微信)

    电脑新建文件夹如何改名字(电脑新建文件夹怎么发送到微信)

  • 状态函数有哪些性质(不属于状态函数有哪些)

    状态函数有哪些性质(不属于状态函数有哪些)

  • 华为HD在哪里(华为hd在哪里找)

    华为HD在哪里(华为hd在哪里找)

  • iphone11快充会有提示吗(苹果11快充会影响电池寿命吗)

    iphone11快充会有提示吗(苹果11快充会影响电池寿命吗)

  • 抖音收藏的视频别人能看到吗(抖音收藏的视频在哪里找出来)

    抖音收藏的视频别人能看到吗(抖音收藏的视频在哪里找出来)

  • 华为文字识别怎么使用(华为文字识别怎样设置)

    华为文字识别怎么使用(华为文字识别怎样设置)

  • 无线耳机怎么调音量大小(无线耳机怎么调频)

    无线耳机怎么调音量大小(无线耳机怎么调频)

  • 抖音app版本过低怎么升级(抖音app版本过低,怎么升级到最新版本苹果手机)

    抖音app版本过低怎么升级(抖音app版本过低,怎么升级到最新版本苹果手机)

  • 卡贴机跟正常机的区别(卡贴机跟正常机的价格)

    卡贴机跟正常机的区别(卡贴机跟正常机的价格)

  • 淘宝已出单是什么意思(淘宝显示已出单是不是已经收货)

    淘宝已出单是什么意思(淘宝显示已出单是不是已经收货)

  • 苹果11几张卡(苹果几是双卡)

    苹果11几张卡(苹果几是双卡)

  • 怎样上传qq群文件而没有提醒(怎样上传qq群文件夹)

    怎样上传qq群文件而没有提醒(怎样上传qq群文件夹)

  • 无线网5g是什么意思啊(无线网络5g)

    无线网5g是什么意思啊(无线网络5g)

  • 苹果11黑名单在哪找(苹果11黑名单在哪里找出来)

    苹果11黑名单在哪找(苹果11黑名单在哪里找出来)

  • win7兼容xp模式在哪调

    win7兼容xp模式在哪调

  • 微博缓存的视频在哪看(微博缓存的视频怎么保存到相册)

    微博缓存的视频在哪看(微博缓存的视频怎么保存到相册)

  • 国家助学金什么时候发(国家助学金什么时候发放2023上半年)

    国家助学金什么时候发(国家助学金什么时候发放2023上半年)

  • 专业拍照ev是啥意思(专业照相ev什么意思)

    专业拍照ev是啥意思(专业照相ev什么意思)

  • 迅雷为什么没有ios版本(迅雷为什么没有修改搜索引擎)

    迅雷为什么没有ios版本(迅雷为什么没有修改搜索引擎)

  • vivox23是不是曲面屏(vivox21是曲屏吗)

    vivox23是不是曲面屏(vivox21是曲屏吗)

  • 下划线上打字不破坏线(下划线上打字不延长)

    下划线上打字不破坏线(下划线上打字不延长)

  • Wifi出现感叹号怎么解决(wifi出现感叹号上不了网怎么办)

    Wifi出现感叹号怎么解决(wifi出现感叹号上不了网怎么办)

  • fpxpress.exe是什么进程 有什么作用 fpxpress进程查询(fpx是什么文件)

    fpxpress.exe是什么进程 有什么作用 fpxpress进程查询(fpx是什么文件)

  • Anaconda(python,pycharm)半详细安装教程

    Anaconda(python,pycharm)半详细安装教程

  • vue系列(三)——手把手教你搭建一个vue3管理后台基础模板(vue系列教程)

    vue系列(三)——手把手教你搭建一个vue3管理后台基础模板(vue系列教程)

  • 年末发票
  • 劳务报酬个税的税率是多少
  • 运输发票抵扣联丢了
  • 贷款利息收入如何开票
  • 成本费用的关系
  • 公司购买手机如何入账
  • 全资收购企业需要交税吗
  • 资产负债表负债总额怎么看
  • 软件委托开发合同印花税
  • 填写银行结算凭证的有关印鉴,应集中由谁保管
  • 应付账款保理是什么意思
  • 冲销上年计提的住房公积金怎么做账
  • 固定性制造费用成本差异是
  • 上个月少计了成本要怎么办
  • 发生工伤事故借条怎么写
  • 工人保险一个月多少钱
  • 增值税的税负率就是用应缴纳的增值税总额
  • 怎么作废未使用的发票
  • 2021虚开发票案例
  • 公司缴纳电费
  • 发票对方已认证怎么冲红
  • 预提固定资产折旧费
  • 工会经费由企业和职工共同负担吗
  • 汽车4s店厂家返利计算方法
  • 公司账户替别人过账
  • 会计科目未付利润属于哪个科目
  • win10 0×0000007b怎么解决
  • Win10任务栏图标居中
  • 平均净资产和净资产
  • 支付宝支付凭证图片
  • win10启用网络发现保存后又变成了关闭
  • 固定资产改扩建账务处理
  • php数组函数题目
  • 会计实务中计提是什么意思
  • 代缴个税的分录
  • 对公账户转私人账户有限额吗
  • 没有抵扣联可以作废吗
  • 埃托沙国家公园发展观兽旅游的优势条件
  • 请问怎么清除
  • php点击复制代码
  • golang char
  • file读取文件内容
  • 跟踪数据包命令
  • 税控盘全额抵扣发票怎么勾选
  • 汇兑损益会计处理方法
  • 培训费用是什么成本
  • 不计提工资直接发放可以吗
  • 提供营业执照范本图片
  • 以非货币性资产对外投资会计处理
  • 无偿赠送怎么做账
  • 增值税买票卖票
  • 国外差旅费怎么入账
  • mongodb operator
  • 巧妙利用谐音的广告语
  • 企业有哪些固定资产
  • 每月工资不一样怎么算误工费呢
  • 酒店客房收入会计分录
  • 公关费用计入什么科目比较好
  • 半成品加工需要什么手续
  • 请演员的费用账务处理
  • 工会需要独立建账吗
  • 固定资产清理时累计折旧提完了怎么账务处理
  • 年初建账考虑要点有哪些
  • 如何设置生产成本总账表格
  • sqlserver使用方法
  • sql server储存过程的创建与使用
  • mysql min
  • windows vista在哪里
  • linux虚拟局域网搭建
  • 查找注册表命令
  • 电脑死机是什么问题
  • kb2859537是什么文件
  • unity怎么打光
  • shell脚本遍历
  • unity3d总结
  • python设计作品
  • javascript中window对象的子对象不包含
  • 河南税务公众号缴费养老保险
  • 社保当月减员当月还可以增加上吗
  • 加大税务稽查工作的建议
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设