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

  • 苹果耳机降噪模式怎么切换(苹果耳机降噪模式原理)

    苹果耳机降噪模式怎么切换(苹果耳机降噪模式原理)

  • 苹果照片上怎么显示地点和时间(苹果照片上怎么写字)

    苹果照片上怎么显示地点和时间(苹果照片上怎么写字)

  • 苹果蓝牙耳机无线和有线的区别(苹果蓝牙耳机无法连接)

    苹果蓝牙耳机无线和有线的区别(苹果蓝牙耳机无法连接)

  • 什么是douyin(什么是抖音社区自律公约)

    什么是douyin(什么是抖音社区自律公约)

  • 腾讯视频能扫码登录吗(腾讯视频能扫码登录会员吗)

    腾讯视频能扫码登录吗(腾讯视频能扫码登录会员吗)

  • 打开天正只显示cad(图纸用天正打开显示不全)

    打开天正只显示cad(图纸用天正打开显示不全)

  • 华为音乐会员下载的歌,会员到期后还能听吗(华为音乐会员下载的歌怎么导出来)

    华为音乐会员下载的歌,会员到期后还能听吗(华为音乐会员下载的歌怎么导出来)

  • 拼多多是哪家公司旗下的(拼多多是哪家公司旗下)

    拼多多是哪家公司旗下的(拼多多是哪家公司旗下)

  • 鼠标接口有哪几种(鼠标的接口是什么)

    鼠标接口有哪几种(鼠标的接口是什么)

  • fx是什么(fx是什么函数)

    fx是什么(fx是什么函数)

  • 苹果触摸调节有什么用(苹果触摸调节有什么功能)

    苹果触摸调节有什么用(苹果触摸调节有什么功能)

  • 荣耀v30跑分大概多少

    荣耀v30跑分大概多少

  • 苹果x手机触摸不灵原因(苹果x手机触摸屏不灵)

    苹果x手机触摸不灵原因(苹果x手机触摸屏不灵)

  • 荣耀10支持蓝牙5.0吗(荣耀10支持蓝牙耳机吗)

    荣耀10支持蓝牙5.0吗(荣耀10支持蓝牙耳机吗)

  • 手机锂电池寿命(手机锂电池寿命能到十年吗)

    手机锂电池寿命(手机锂电池寿命能到十年吗)

  • 为什么打开数据连接却上不了网(为什么打开数据网络不能用)

    为什么打开数据连接却上不了网(为什么打开数据网络不能用)

  • 抖音禁止播放需要几天(抖音现已做禁止播放处理)

    抖音禁止播放需要几天(抖音现已做禁止播放处理)

  • 淘宝商品属性怎么设置(淘宝商品属性值是什么)

    淘宝商品属性怎么设置(淘宝商品属性值是什么)

  • 三星g9650是不是s9(三星g965w是什么版本)

    三星g9650是不是s9(三星g965w是什么版本)

  • QQ扩列为什么不能匹配了(QQ扩列为什么不见了)

    QQ扩列为什么不能匹配了(QQ扩列为什么不见了)

  • 如何运营公众号(如何运营公众号月入3万)

    如何运营公众号(如何运营公众号月入3万)

  • 爱剪辑如何剪辑音频(爱剪辑如何剪辑视频)

    爱剪辑如何剪辑音频(爱剪辑如何剪辑视频)

  • qq怎么看认识多久(qq怎么看认识多少天的人)

    qq怎么看认识多久(qq怎么看认识多少天的人)

  • 滴滴打车怎么开发票(滴滴打车怎么开行程单)

    滴滴打车怎么开发票(滴滴打车怎么开行程单)

  • 拼多多怎么设置不震动(拼多多怎么设置送货上门)

    拼多多怎么设置不震动(拼多多怎么设置送货上门)

  • ip是什么意思(Tip是什么意思英语)

    ip是什么意思(Tip是什么意思英语)

  • 个人捐款合法吗
  • 企业回购股票会使所有者权益
  • 房地产土地使用税纳税义务发生时间
  • 应付票据是资产吗
  • 管理费用贷方有哪些递减
  • 分支机构是否享受小微企业企业所得税优惠?
  • 公司广告法违规交不起罚款怎么办
  • 固定资产报废账务怎么处理
  • 房屋租赁费发票可以抵扣吗
  • 生产企业出口退税流程及账务处理
  • 应交税费不核算
  • 汇算清缴补交需要调报表吗
  • 作废章盖在哪个位置
  • 免征的教育费附加如何账务处理
  • 加权投资年限怎么计算
  • 小规模纳税人缴税计算
  • 收到发票最晚什么时候付款
  • 付款网站制作
  • win10开机无限werfault一直刷新
  • u盘启动器安装系统
  • 收到对方公司开的电子专票怎么入账
  • 装饰装修工程月薪多少
  • 运输发票符合什么要求
  • windows不能打开exe文件
  • php自动编号
  • php 性能优化
  • react 路由参数
  • es6体验
  • 个人所得税申报操作流程
  • 股东投资款怎么存入公司
  • 财务报表没有申报会影响领发票吗
  • 实际库存小于账面库存
  • 租入固定资产改良
  • 固定资产停止使用
  • 管理不善造成的货物损失进项税可以抵扣吗
  • c语言printf输出数组
  • python怎么访问属性
  • PostgreSQL教程(三):表的继承和分区表详解
  • 无法收到的租金要交房产税吗
  • 补交以前年度环保税会计分录
  • 自然人独资和个人独资是一样的吗
  • SQL server 2008中的数据库能否只包含数据文件
  • 小规模企业申报哪些税
  • 企业所得税汇算清缴扣除标准2023
  • 本年利润和利润分配有什么区别
  • 分公司注销怎么起诉公司
  • 先预付货款,货到了怎么做账
  • 出差餐补算在工资里吗
  • 产品检测费计入什么二级科目里
  • 企业出售废旧材料的收入
  • 单位内部部门之间人员调整
  • 小规模纳税人手工帐怎么做
  • 应收账款较多怎么办
  • Python3.6-MySql中插入文件路径,丢失反斜杠的解决方法
  • Windows 9 Storage Sense储存功能更多图像
  • windows2008版本区别
  • centos 查看服务
  • 打开linux系统
  • 关闭windows报错
  • centosgui
  • win8打开蓝牙设置
  • 如何将win10系统从c盘迁移到d盘
  • xwizard.exe是什么
  • msvc命令行
  • nodejs支付宝支付
  • combobox 添加选项
  • 批处理 dir
  • unity game optimization
  • js日期格式
  • javascript基础笔记
  • jquery获取button的value值
  • JavaScript中的方法名不区分大小写
  • js 原型继承的几种方法
  • androidstudio webview
  • android数据存储文件读写实验
  • 税务局的人工资多少
  • 虚假纳税申报的法律责任
  • 出口退税需要哪些单据
  • 税务干部工作纪实怎么写
  • 公车补贴计入工资吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设