uni-app + SpringBoot +stomp 支持websocket 打包app

news/2025/1/15 19:51:27/

文章目录

  • 一、概述:
  • 二、配置:
    • 1. 后端配置
    • 2. uni-app(app端)
    • 3. 使用

一、概述:

websocket 协议是在http 协议的基础上的升级,通过一次http 请求建立长连接,转而变为TCP 的全双工通信;而http 协议是一问一答的请求方式方式。

二、配置:

1. 后端配置

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer{@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {//注册STOMP协议的节点(endpoint),并映射指定的url//注册一个STOMP的endpoint,并指定使用SockJS协议// 此处配置支持PC 端浏览器,客户端访问采用http registry.addEndpoint("/websocket").setAllowedOriginPatterns("*").withSockJS();// 此处配置支持uniapp  app 端打包,不要带withSockJS, 客户端访问 采用ws 协议registry.addEndpoint("/websocket-app").setAllowedOriginPatterns("*");}@Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) {//配置消息代理(Message Broker)//广播式应配置一个/topic消息代理registry.enableSimpleBroker("/topic");}
}

2. uni-app(app端)

websocket-uni.js

let socketOpen = false;
let socketMsgQueue = [];
import http from "@/common/Http.vue";export default {client: null,baseURL: `ws://192.168.1.1:9109/websocket-app`,//uni-app使用时不能使用http不然监听不到,需要使用wsinit(headers) {if (this.client) {return Promise.resolve(this.client);}return new Promise((resolve, reject) => {const ws = {send: this.sendMessage,onopen: null,onmessage: null,close: this.closeSocket,};uni.connectSocket({url: this.baseURL,header: headers,success: function() {console.log("WebSocket连接成功");}});uni.onSocketOpen(function(res) {console.log('WebSocket连接已打开!', res);socketOpen = true;for (let i = 0; i < socketMsgQueue.length; i++) {ws.send(socketMsgQueue[i]);}socketMsgQueue = [];ws.onopen && ws.onopen();});uni.onSocketMessage(function(res) {console.log("回馈")ws.onmessage && ws.onmessage(res);});uni.onSocketError(function(res) {console.log('WebSocket 错误!', res);});uni.onSocketClose((res) => {this.client.disconnect();this.client = null;socketOpen = false;console.log('WebSocket 已关闭!', res);});const Stomp = require('./stomp.js').Stomp;Stomp.setInterval = function(interval, f) {return setInterval(f, interval);};Stomp.clearInterval = function(id) {return clearInterval(id);};const client = this.client = Stomp.over(ws);client.connect(headers, function() {console.log('stomp connected');resolve(client);});});},disconnect() {uni.closeSocket();},sendMessage(message) {if (socketOpen) {uni.sendSocketMessage({data: message,});} else {socketMsgQueue.push(message);}},closeSocket() {console.log('closeSocket');},
};

3. 使用

	import WebSocket from '@/components/js/websocket-uni1.js';if (self.map.get("token")) {//需要上传tokenheaders.Authorization = self.map.get("token");}WebSocket.init(headers).then(client => {//接收反馈端口,成功方法,错误方法client.subscribe('/topic/getResponse', this.responseCallback, this.onFailed);});responseCallback: function(frame) {let self=this;let body = JSON.parse(frame.body);uni.showToast({icon:"success",icon: 'none',position:"center",title:"消息:您有一个新的消息,请注意接收"},2000)},onFailed: function(frame) {//this.$notify.error({//  title: '系统错误',//  message: '消息服务连接失败!',//});console.log('STOMP: ' + frame);},

http://www.ppmy.cn/news/1056054.html

相关文章

找到所有数组中消失的数

找到所有数组中消失的数&#xff0c;OJ练习 一、描述二、方法一三、方法二 一、描述 给你一个含n个整数的数组nums&#xff0c;其中nums[i]在区间[1&#xff0c;n]内。请你找出所有在[1&#xff0c;n]范围内但没有出现在nums中的数字&#xff0c;并以数组的形式返回结果&#…

软考高级系统架构设计师系列论文九十九:论软件开发平台的选择和应用

软考高级系统架构设计师系列论文九十九:论软件开发平台的选择和应用 一、相关知识点二、摘要三、正文四、总结一、相关知识点 软考高级系统架构设计师系列之:面向构件的软件设计,构件平台与典型架构二、摘要 本文从一个行业MIS系统的开发实践,讨论了软件开发平台的选择和应…

安卓动态申请权限

我们在使用一些官方app时&#xff0c;刚下载进去之后经常会弹出各种各样的权限获取请求&#xff0c;今天简单学习了下&#xff0c;希望不会误人子弟哈哈哈哈。 一、将需要用到的权限添加到Manifest清单里 <uses-permission android:name"android.permission.WRITE_EXT…

Docker是什么?详谈它的框架、使用场景、优势

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、什么是 Docker&#xff1f; 二、Docker 的架构 1、Docker客户端 2、Docker守护进程 3、Docker镜像 4、Docker容器 5、Docker…

手写嵌入式操作系统

学习之前需要安装keil 参照Keil uvision5安装 #include<stc8h.h> #include<intrins.h> #define MAX_TASKS 2 //假设当前系统只有2个task #define MAX_TASK_DEP 32unsigned char idata task_sp[MAX_TASKS]; //任务的堆栈指针 unsigned char idata task_stack[M…

每日一学——认识路由器

路由器是一种网络设备&#xff0c;它用于在计算机网络中转发数据包。它能够在不同的网络之间选择最佳路径&#xff0c;将数据从源地址传输到目的地址。 路由器工作原理&#xff1a; 路由表&#xff1a;路由器内部有一个路由表&#xff0c;它记录了网络的连接关系和路径。路由器…

VUE id回写name的问题

起因 我们有部门&#xff0c;单位&#xff0c;传的是id&#xff0c;但是页面不管显示&#xff0c;还是回写&#xff0c;新增都要展示单位名/部门名。这个其实是前端的事情&#xff0c;但是我目前是前端也是我做&#xff0c;我们使用的是vue3&#xff0c;这个问题用List可能不好…