微服务使用SockJs+Stomp实现Websocket 前后端实例 | Vuex形式断开重连、跨域等等问题踩坑(二)

大家好,我是程序员大猩猩。

上次我们实践了,Java后端如何完成SockJS+Stomp的配置实现。

微服务使用SockJs+Stomp实现Websocket 前后端实例 | Vuex形式断开重连、跨域等等问题踩坑(一)

那么今天我们做一下web vue端的是如何来实现的。

这里我罗列一下,我实现所使用的vue版本。

"sockjs-client": "^1.5.0",
"stompjs": "^2.3.3",
"vue": "^3.0.0",
"vuex": "^4.1.0"
// 本地Node版本号
node v14.21.3

这里,我从创建好工程后,导入工程开始说起,说说我碰到的问题及我的解决方法,一遍大家更好的理解。

首先,我是采用vue create *** 来创建一个项目,中间选择使用vuex组件。待项目创建后,我这里使用WebStorm开发工具,将项目导入后,工具会自动让我们npm install。

在项目的根目录

npm install sockjs-client
npm install stompjs

或者

package.json->dependencies->下添加

"sockjs-client": "^1.5.0",
"stompjs": "^2.3.3",

因为我们是需要在vuex中实现SockJs的,所以在src内创建store目录,并且完成一下代码store/index.js

import modules from './modules'import { createStore } from 'vuex'
export default new createStore({modules,strict: false
})

在store目录下创建modules文件目录,目录内新增index.js和websocket.js

// index.jsconst files = require.context('.', false, /\.js$/)
const modules = {}files.keys().forEach(key => {if (key === './index.js') returnmodules[key.replace(/(\.\/|\.js)/g, '')] = files(key).default
})export default modules// websocket.jsimport {createStore} from 'vuex'
import SockJS from 'sockjs-client'
import Stomp from 'stompjs'
import config from '../../config/index'
// 后端ws连接 http开头形式
const url = config.scokJsUrl

​​​​​​​接下来我们分析一下,websocket在前端需要什么操作呢?

1. 初始化

WEBSOCKET_INIT({commit,state}, header) {commit('WEBSOCKET_INIT', header)
},

​​​​​​​

2. 发送消息

WEBSOCKET_SEND({commit,state}, p) {commit('WEBSOCKET_SEND', p)
},

​​​​​​​

3. 订阅

WEBSOCKET_UNSUBSRCIBE({commit,state}, p) {commit('WEBSOCKET_UNSUBSRCIBE', p)
},

4. 断开

WEBSOCKET_DISCONNECT({commit,state}) {commit('WEBSOCKET_DISCONNECT')
}

​​​​​​​我们在store注册actions,actions注册以上方法。然后在mutations内实现以上方法。

 mutations: {WEBSOCKET_INIT(state, header) {if (state.stompClient == null || !state.stompClient.connected) {state.url = urlif (state.stompClient != null && state.websocket.readyState === SockJS.OPEN) {state.stompClient.disconnect(() => {this.commit('WEBSOCKET_CONNECT', header)})} else if (state.stompClient != null && state.websocket.readyState === SockJS.CONNECTING) {console.log('连接正在建立')return} else {this.commit('WEBSOCKET_CONNECT', header)}// 断线重连实现块// 断线重连实现块// 断线重连实现块// 断线重连实现块} else {console.log('连接已建立成功,不再执行')}},WEBSOCKET_CONNECT(state, header) {const _this = thisconsole.log('URL链接 ' + state.url)const websock = new SockJS(state.url)console.log('URL链接 ' + websock)state.websocket = websock// 获取STOMP子协议的客户端对象const stompClient = Stomp.over(websock)stompClient.connect(header,() => {console.log('链接成功!')state.listenerList.forEach(item => {state.stompClient.subscribe(item.topic, item.callback, header)})},(err) => {console.log('链接失败!', err)// 第一次连接失败和连接后断开连接都会调用这个函数 此处调用重连setTimeout(() => {_this.commit('WEBSOCKET_INIT', header)}, 1000)})state.stompClient = stompClient},WEBSOCKET_SEND(state, p) {state.stompClient.send(p.topic, {userId: p.userId}, p.data)},WEBSOCKET_UNSUBSRCIBE(state, p) {state.stompClient.unsubscribe(p)for (let i = 0; i < state.listenerList.length; i++) {if (state.listenerList[i].topic === p) {state.listenerList.splice(i, 1)console.log('解除订阅:' + p + ' size:' + state.listenerList.length)break}}},WEBSOCKET_DISCONNECT(state) {if (state.stompClient != null) {console.log('关闭连接')state.stompClient.disconnect()}}
},

​​​​​​​sockJs主要连接代码为WEBSOCKET_CONNECT内:

const websock = new SockJS(state.url)
console.log('URL链接 ' + websock)
state.websocket = websock
// 获取STOMP子协议的客户端对象
const stompClient = Stomp.over(websock)

    当websocket.js实现完成后,我们也基本完成的vue端的实现,接下来在现实端页面,调用vuex即可。参考我的methods

methods: {disconnect() {clearInterval(this.connectionTimer);clearInterval(this.timer);this.$websocket.dispatch("WEBSOCKET_DISCONNECT");},stompConnection() {const loginUserId = "my you Dad";const headers = {token: "SSSRIRTOKEN326458",userId: loginUserId};this.$websocket.dispatch("WEBSOCKET_INIT", headers);const _this = this;const stompClient = this.$websocket.getters.stompClient();this.connectionTimer = setInterval(() => {if (stompClient != null && stompClient.connected) {clearInterval(this.connectionTimer);_this.subscriptions = [];_this.subscriptions.push(stompClient.subscribe("/user/" + loginUserId + "/queue/ping", msg => {console.log("我要的ping信息" + msg.body);}));// 定时推送订阅信息this.timer = setInterval(function () {const header = {userId: loginUserId};stompClient.send("/ping", header, "ping");}, 10000);} else {console.log("等待连接成功");}}, 500);}
}

​​​​​​​前后端一起启动项目,查看结果。

图片

StompJS的一些设置:

// 关闭控制台打印
// stompClient.debug = null
// stompClient.heartbeat.outgoing = 20000
// // 客户端不从服务端接收心跳包
// stompClient.heartbeat.incoming = 0

​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/5273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java浮点类型和计算“精度丢失”原因

引言 在计算机科学领域中,浮点数是一种用于表示近似实数的数据类型,广泛应用于科学计算、工程设计、金融建模等领域。在日常编程中,我们经常会遇到浮点数的计算和处理,然而,由于浮点数在计算机中的存储和表示方式,以及二进制与十进制之间的转换问题,可能会导致计算精度…

现代机器学习(ML)技术在医疗成像领域的新应用

现代机器学习(ML)技术在医疗成像领域的新应用主要包括以下几个方面: 一、自动病变检测 使用深度学习算法,尤其是卷积神经网络(CNN),自动识别和分类医学影像中的病变,如肿瘤、炎症等。自动病变检测是现代机器学习技术在医疗成像领域应用的一个重要方向。它主要通过以下…

hive-row_number() 和 rank() 和 dense_rank()

row_number() 是无脑排序 rank() 是相同的值排名相同&#xff0c;相同值之后的排名会继续加&#xff0c;是我们正常认知的排名&#xff0c;比如学生成绩。 dense_rank()也是相同的值排名相同&#xff0c;接下来的排名不会加。不会占据排名的坑位。

智能私信软件:转化率提升的神器

在数字化营销领域&#xff0c;利用智能私信软件策略提升转化率已经成为一种不可忽视的趋势。随着人工智能技术的发展&#xff0c;这些软件变得越来越智能&#xff0c;能够根据用户的行为和偏好提供个性化的沟通体验。在这篇文章中&#xff0c;我们将探讨如何有效地运用智能私信…

Leetcode_相交链表

✨✨所属专栏&#xff1a;LeetCode刷题专栏✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 题目&#xff1a; 题解&#xff1a; 看到这个题目首先我们要排除链表逆置的想法&#xff0c;如图、因为c1节点只有一个next指针&#xff0c;逆置后不可能同时指向a2和b3节点。 其次有的的同学…

【RabbitMQ】可靠性策略(幂等,消息持久化)

MQ可靠性策略 发送者的可靠性问题生产者的重连生产者确认 MQ的可靠性数据持久化Lazy Queue 消费者的可靠性问题消费者确认机制消息失败处理 业务幂等性简答问题 发送者的可靠性问题 生产者的重连 可能存在由于网络波动&#xff0c;出现的客户端连接MQ失败&#xff0c;我们可以…

JavaScript 中的 this 到底指向谁? 今天彻底把它征服!!!

概述 我们知道&#xff0c;JS 中的 this 指向问题&#xff0c;一直是一个经久不衰的重点和考点。那么它到底难不难呢&#xff1f;怎么说呢&#xff1f;它也难也不难&#xff0c;你要是不把它理清楚&#xff0c;随意变化一下就能把你绊倒&#xff1b;但是你要是把他理清楚了以后…

VUE+TS使用elementUI的el-checkbox双重v-for循环做勾选

html部分 <template><div class"hello"><el-form :model"elForm"> <!-- cities对象数组形式 --><el-form-item v-for"(item, topIndex) in cities" :key"topIndex"> <!--item.checked 是每一个item…

最新游戏陪玩语音聊天系统3.0商业升级独立版本源码+搭建教程

首发价值29800元的最新商业版游戏陪玩语音聊天系统3.0商业升级独立版本源码。 下 载 地 址 &#xff1a; runruncode.com/php/19748.html 1. 新增人气店员轮播功能。 2. UI界面优化&#xff0c;包括游戏图标展示和分类展示的改进。 3. 增加动态礼物打赏功能。 4. 新增礼…

SQL底层执行过程

MySQL 的查询流程 客户端请求连接器 负责与客户端的通信,是半双工模式&#xff08;半双工(Half Duplex)数据传输指数据可以在一个信号载体的两个方向上传输,但是不能同时传输。&#xff09;&#xff0c;验证请求用户的账户和密码是否正确&#xff0c;③如果用户的账户和密码验…

Codigger数据篇(下):数据安全的全方位保障

在数字化浪潮中&#xff0c;数据已成为现代企业的核心财富。Codigger作为领先的数据服务平台&#xff0c;深知数据安全对于用户的重要性&#xff0c;因此在深挖数据价值的同时&#xff0c;我们始终坚守数据安全防线。 一、双重加密技术保障 Codigger平台运用先进的加密通信和…

MATLAB初学者入门(22)—— 哈希算法

哈希算法在计算机科学中广泛用于数据管理、安全、错误检测等多种应用。在MATLAB中&#xff0c;可以通过内置函数或自定义函数来实现哈希算法&#xff0c;以便于数据的快速检索、唯一性验证和数据完整性检查。 案例分析&#xff1a;使用哈希算法快速检索数据 假设我们有一个大型…

vue2.7与vue2.6、vue3的区别

官网链接&#xff1a;https://v2.cn.vuejs.org/v2/guide/migration-vue-2-7.html -组合式与选项式 选项式&#xff1a;export default { 各种选项关键字名&#xff0c;都定好了&#xff0c;无需引入&#xff0c;配对放置即可}

RabbitMQ Transport indicated EOF 总结

Rabbitmq报错 pika.exceptions.IncompatibleProtocolError StreamLostError (‘Transport indicated EOF‘,) 网上的答案是端口写错了&#xff0c;产生此报错的原因是我将port写成了15672&#xff0c;15672是rabbitmq管理页面的端口 port 15672rabbitmq需要通过端口5672连…

stm32单片机开发一、中断之外部中断实验

stm32单片机的外部中断和定时器中断、ADC中断等都由stm32的内核中的NVIC模块控制&#xff0c;stm32的中断有很多中&#xff0c;比如供电不足中断&#xff0c;当供电不足时&#xff0c;会产生的一种中断&#xff0c;这么多中断如果都接在CPU上&#xff0c;或者说CPU去处理&#…

Leetcode—2639. 查询网格图中每一列的宽度【简单】

2024每日刷题&#xff08;121&#xff09; Leetcode—2639. 查询网格图中每一列的宽度 实现代码 class Solution { public:int func(int num) {if(num 0) {return 1;}int len 0;while(num ! 0) {len;num / 10;}return len;}vector<int> findColumnWidth(vector<ve…

[开发|JAVA] asdf安装adoptium openJDK

编写原因 asdf使用install命令安装adoptium openJDK&#xff0c;会因为网络的原因导致安装失败&#xff0c;本篇文章介绍在adoptium官方下载压缩包安装openJDK。 openjdk下载地址 Eclipse Temurin 安装 以temurin-17.0.99为例演示安装 在temurin-17.0.99安装包所在地址打…

如何测试响应式网站

我们每天通过多种设备访问互联网。移动电话&#xff0c;台式机/笔记本电脑&#xff0c;平板电脑&#xff0c;平板电脑…我们所掌握的设备数量已经增长为天文数字。作为消费者&#xff0c;体验很棒。我们可以随时随地在任何设备上自由访问互联网。但对于Web开发人员&#xff0c;…

双非二本找工作前的准备day15

学习目标&#xff1a; 每天复习代码随想录上的题目1-2道算法&#xff08;时间充足可以继续&#xff09; 今日碎碎念&#xff1a; 1&#xff09;双非本真难受... 力扣刷题 算法 力扣20&#xff1a;20. 有效的括号 class Solution {public boolean isValid(String s) {//这里…

类加载子系统之类的生命周期(待完善)

0、前言 文中大量图片来源于 B站 黑马程序员 0.1、类加载子系统在 JVM 中的位置 类加载器负责的事情是&#xff1a;加载、链接、解析 0.2、与类的生命周期相关的虚拟机参数 参数描述-XX:TraceClassLoading打印出加载且初始化的类 1、类的生命周期 堆上的变量在分配空间的时…