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

  • a14和a12z哪个性能好(a14和a12z谁强)

    a14和a12z哪个性能好(a14和a12z谁强)

  • 腾讯旗下的视频软件有哪些(腾讯旗下的视频软件)

    腾讯旗下的视频软件有哪些(腾讯旗下的视频软件)

  • 手机进水无信号的解决方法(手机进水无信号怎么修)

    手机进水无信号的解决方法(手机进水无信号怎么修)

  • 华为nova7第一次怎么充电(华为nova7新机第一次怎么充电)

    华为nova7第一次怎么充电(华为nova7新机第一次怎么充电)

  • i78550u是低端处理器吗(i78550属于什么水平)

    i78550u是低端处理器吗(i78550属于什么水平)

  • 拼多多差评后申请退款差评还在吗(拼多多差评申诉理由怎么写通过率高)

    拼多多差评后申请退款差评还在吗(拼多多差评申诉理由怎么写通过率高)

  • 探探能搜索用户吗(探探搜索用户名对方知道吗)

    探探能搜索用户吗(探探搜索用户名对方知道吗)

  • 注销apple id账号(注销apple id账号后,微信还能用吗)

    注销apple id账号(注销apple id账号后,微信还能用吗)

  • 怎么下载抖音视频到手机(怎么下载抖音视频到u盘)

    怎么下载抖音视频到手机(怎么下载抖音视频到u盘)

  • 淘宝可以更改实名认证吗(淘宝能更改实名认证吗)

    淘宝可以更改实名认证吗(淘宝能更改实名认证吗)

  • 手机电池健康多少正常(手机电池健康多久掉1%正常)

    手机电池健康多少正常(手机电池健康多久掉1%正常)

  • wlan有个叹号怎么解决(wifi有个叹号啥意思)

    wlan有个叹号怎么解决(wifi有个叹号啥意思)

  • windowsapps文件夹可以删除吗(windowsapps文件夹拒绝访问)

    windowsapps文件夹可以删除吗(windowsapps文件夹拒绝访问)

  • 华为手机虚拟返回键在哪里设置(华为手机虚拟返回键设置)

    华为手机虚拟返回键在哪里设置(华为手机虚拟返回键设置)

  • 移动硬盘是机械的还是固态的(移动硬盘是机械硬盘吗?)

    移动硬盘是机械的还是固态的(移动硬盘是机械硬盘吗?)

  • 光猫重启后不能上网怎么办(光猫重启后路由器连不上网怎么办)

    光猫重启后不能上网怎么办(光猫重启后路由器连不上网怎么办)

  • 金立的杂志锁屏怎么取消(金立手机杂志锁屏怎么设置)

    金立的杂志锁屏怎么取消(金立手机杂志锁屏怎么设置)

  • acer是什么意思(placer是什么意思)

    acer是什么意思(placer是什么意思)

  • 为什么抖音不能用qq登录(为什么抖音不能关注人了)

    为什么抖音不能用qq登录(为什么抖音不能关注人了)

  • 相机快门速度怎么调节(相机快门速度怎么调快)

    相机快门速度怎么调节(相机快门速度怎么调快)

  • 苹果电脑pro和air区别(苹果电脑pro和air哪个贵)

    苹果电脑pro和air区别(苹果电脑pro和air哪个贵)

  • 手机边缘裂开怎么修复(手机边缘裂开怎么处理)

    手机边缘裂开怎么修复(手机边缘裂开怎么处理)

  • 全民k歌最近听众记录怎么删去(全民k歌最近听过你的歌是什么意思)

    全民k歌最近听众记录怎么删去(全民k歌最近听过你的歌是什么意思)

  • phpcms php.ini在哪里(phpcms怎么用)

    phpcms php.ini在哪里(phpcms怎么用)

  • 汇算清缴退税会计科目
  • 关于个人取得的成果
  • 税务师事务所是代理记账公司吗
  • 医院这么开发票
  • 应收利息增加会计分录
  • 认证不过的进项税调出分录
  • 股东股权转让印花税公司可以报销吗
  • 小规模纳税人租金发票的税率是多少
  • 存款利息缴纳个税
  • 发票查验是什么字体
  • 过路费可以入账吗
  • 签章是签字还是盖章z还是手印
  • 企业基本医疗保险和综合医疗保险
  • 资产的名义已使用年限与实际已使用年限的区别与联系
  • 发票开出来对方不走账会怎么样?
  • 付稿费会计分录
  • 个人开增值税普票有没有限额
  • 收到供应商发票的会计处理怎么做?
  • 税后利润分配还要交税
  • 提取备用金的手续费会计分录
  • 长期股权投资佣金手续费计入
  • 报销抵冲银行日记帐要怎么入帐?
  • 计提坏账为什么无法收回呢
  • 到期一次还本付息的利息怎么算
  • 非营利组织免税收入孳生的银行存款利息
  • 企业所得税计算方法公式
  • 股票股利和现金股利的共同点
  • 法人把资产转移到国外有没有限制
  • 苹果mac os x 10.7.5
  • 如何修复win11系统
  • 公积金提取条件和标准
  • 收到银行退回余款
  • 房产税的会计科目怎么做
  • 解决胃胀气最快方法
  • 商誉减值计算步骤
  • php_fpm
  • 存货的核算方法一次可以选用几个
  • 经营性存款人违反规定
  • mkpart命令
  • saas web
  • 境外企业在境内提供服务 企业所得税
  • 差旅费必须填写差旅费报销单吗
  • SQL Server 在Management Studio中使用Web浏览器
  • 企业汇兑收益所得税税率
  • 航空公司可以开发票吗
  • 房地产开发企业成本核算方法
  • 认缴制下实收资本如何证明
  • 住宿发票 抵扣
  • 固定资产内部转移流程
  • 制造费用转入生产成本摘要怎么写
  • 应收账款入账价值包括现金折扣吗
  • 自产货物用于在建工程账务处理
  • 存货跌价准备的计算
  • 新成立的公司哪个地方能查到
  • 规范的记账凭证是什么
  • mysql版本信息
  • win7打印机共享关闭密码保护
  • 哪个是win8.1更新win10的补丁
  • c盘的windows
  • ubuntuone
  • mac 命令大全
  • centos怎么查看服务器配置
  • guardhp.exe是什么意思
  • xp升win10教程
  • window10耳机有电流
  • win7电脑全屏
  • linux系统中可用于添加用户账号
  • Unity3D游戏开发pdf
  • vue仿知乎
  • android怎么学
  • vue组件精讲
  • 黑马程序员c++语言讲义
  • macos moja
  • jquery中判断某个类是否存在的方法
  • Windows下python2.7.8安装图文教程
  • 税务局查帐流程
  • 国税地税征管体制改革方案全文
  • 12366国税网上申报
  • 国税系统打印不了发票怎么办
  • 税务稽查局工资高吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设