【WebSocket】基于 stomp协议的WebSocket,Springboot中实现订阅主题的WebSocket

Springboot + vue3 + vite 实现 Redis消息订阅 + WebSocket 项目背景: 最近在做驿站的项目,前端展示设备列表,包括设备名称、编号、是否在线、开关状态。通过网页上的开关按钮来实现远程控制设备的开关功能。 架构介绍: 后端采用SpringBoot + redis + stomp 实现跟设备的消息订阅。 前端采用:Vue3 +Vite + sockjs-client + stompjs 流程介绍: 后端设备服务将设备的所有信息都存到redis 里面, web 服务取出所有设备最新信息展示到前台。点击开关按钮,将开关状态发送到后台controller, 在controll 阅读详情

1.使用场景

我们在与前端即时推送一些消息的时候,基本都是靠WebSocket实现的,而当前端的项目中需要建立多个WebSocket或者给特定的用户发送不同的消息时,传统的实现方式,我们在WebSocket中会传一些特定的参数当做标识,而今天我们所说的这种基于stomp协议的WebSocket,可以支持客户端订阅不同的主题,我们只要向不同的主题发送信息就行了。

2.SpringBoot中的实现

2.1 Maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>

2.2 配置基于stomp协议的WebSocket

@Configuration
//注解开启使用STOMP协议来传输基于代理(message broker)的消息,这时控制器支持使用@MessageMapping,就像使用@RequestMapping一样
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer
{

    //某些特定业务中,可能要对WebSocket传入的值做一些操作,或者在刚刚建立连接的时候做一些操作,
    //这里支持我们配置自定义的拦截器,去做拦截的操作。
    @Autowired
    private ConnWebSocketInterceptor connWebSocketInterceptor;

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        //注册一个STOMP的endpoint,并指定使用SockJS协议
        registry.addEndpoint("/endpoint").setAllowedOrigins("*").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        //客户端发送消息的请求前缀
        registry.setApplicationDestinationPrefixes("/app");
        //客户端订阅消息的请求前缀,topic一般用于广播推送,queue用于点对点推送
        registry.enableSimpleBroker("/topic", "/queue");
        //服务端通知客户端的前缀,可以不设置,默认为user
        registry.setUserDestinationPrefix("/user");
    }

    // 注册拦截器
    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(connWebSocketInterceptor);
    }
}

2.3(视业务而定)配置WebSocket拦截器

@Component
public class ConnWebSocketInterceptor implements ChannelInterceptor {

    // 这里使用的是消息模板,注意,这里的消息模板需要等上面的配置类配置结束之后才能使用
    // 但是上面的配置类同样需要我们拦截器的Bean,如何这里不加@Lazy注解,会导致上面的配置类配置失败。
    @Lazy
    @Autowired
    private SimpMessagingTemplate messagingTemplate;

    // 这里实现的是在客户端与服务端建立连接之后,直接发送一条信息给客户端
    @Override
    public void afterSendCompletion(Message<?> message, MessageChannel channel, boolean sent, Exception ex) {
         messagingTemplate.convertAndSend("/topic/mytopic","Hello Client!");
    }
}

2.4 通过握手拦截器校验安全

public class HandleShakeInterceptors implements HandshakeInterceptor {

    /**
     * 在握手之前执行该方法, 继续握手返回true, 中断握手返回false.
     * 通过attributes参数设置WebSocketSession的属性
     */
    
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,
                                   WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
        //这里写业务代码,判断连接的用户名密码,或者有无Token等,判断让不让连接,不让连接返回false
        return true;
    }

    /**
     * 在握手之后执行该方法. 无论是否握手成功都指明了响应状态码和相应头.
     */
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response,
                               WebSocketHandler wsHandler, Exception exception) {

    }
    
}

2.5 服务端配置接收消息的方法

@Controller
public class TestController
{

    // 消息发送模板
    @Autowired
    private SimpMessagingTemplate messagingTemplate;

    // 接收后缀为/test的消息,可以是/app/test
    //@SendTo  发送给/topic/test的主题
    @MessageMapping("/test")
    @SendTo("/topic/test")
    public void test(String str){
        messagingTemplate.convertAndSend("receive:" + str);
    }

    //点对点式的发送消息
    public void P2P(){
        User user=new User();
	    user.setUserId(1);
        messagingTemplate.convertAndSendToUser(user.getUserId,"/queue/p2p","Hello" + user.getUserId);
    } 
}

3.前端实现

这里只写JS中的方法实现

<script src="https://cdn.bootcss.com/sockjs-client/1.4.0/sockjs.min.js"></script>
<script src="https://cdn.bootcss.com/stomp.js/2.3.2/stomp.min.js"></script>

订阅主题 

var stompClient = null;


// 订阅主题
function connect() {
    var socket = new SockJS('http://192.168.1.42:8080/endpoint');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/test', function (greeting) {
            showGreeting(JSON.parse(greeting.body).content);
        });
    });
}

// 订阅点对点
function connect() {
    var userId = 1;
    var socket = new SockJS('http://192.168.1.42:8080/endpoint');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/user/' + userId + '/queue/getResponse', function (greeting) {
            showGreeting(JSON.parse(greeting.body).content);
        });
    });
}


//断开连接
function disconnect() {
    if (stompClient !== null) {
        stompClient.disconnect();
    }
}

function showGreeting(message) {
    $("#greetings").append("<tr><td>" + message + "</td></tr>");
}

 

Springboot超仔细整合websocket(附案例代码) 搭建一个性能强大的消息推送系统 添加依赖:确保在pom.xml中添加Spring WebSocket和WebSocket依赖。创建WebSocket处理器(端点):编写一个处理WebSocket消息的处理器。完成对应的生命周期如果需要传递http第一次握手时候处理信息 需要添加对应的处理配置配置WebSocket:配置WebSocket相关的Bean和端点(值得注意的是每一个端点对象对一个用户线程 所以spring的单实列bean和异步处理再这里无法生效 具体会在踩坑笔记中提及)整合的一些细节。 阅读详情

相关推荐

Spring Boot之WebSocket实现点对点通讯

1. 后台注册一个WebSocket @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEnd...

不再更新,新博客 chgl16.space 1837

WebSocket整合SpringBoot、SockJS、Stomp、Rabbitmq分布式消息推送

(1)HTML5 WebSocket、异常重连、心跳检测;(2)SockJS、Stomp、RabbitMQ Stomp消息代理;(3)分别用Nginx和Spring Cloud Gateway实现多实例负载均衡;(4)可靠消息推送(Stomp持久化队列、客户端ACK确认机制);(5)Java原生、Stomp客户端实现(非浏览器客户端);(6)Websocket拦截器结合 Spring security、jwt token认证授权;(7)Vue前端版本实现、Java客户端实现;(8)消防物联网平台消息推送案例,需求分析、设计思路、编码实现、效果演示。

SpringBoot学习-(十三)SpringBoot中建立WebSocket连接(STOMP)

STOMP协议介绍STOMP,Streaming Text Orientated Message Protocol,是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互,类似于OpenWire(一种二进制协议)。由于其设计

大白能的博客 4万+

SpringBoot整合WebSocket实现订阅消息推送

SpringBoot整合WebSocket

weixin_44712778的博客 3913

SpringBoot - 整合WebSocket及STOMP部分API简介

WebSocket简介 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 WebSocket是一个消息架构,不强制使用任何特定的消息协议,它依赖于应用层解释消息的含义...

江南烟雨却痴缠丶 1423

Springboot+websocket+Stomp使用Redis实现分布式消息推送

引言 由于新需求,需要实现多语言下实现websocket消息通讯推送,本来打算引入高级消息队列协议的,但体量没那么大,所以选型时选择了通过redis的队列来实现。 实现步骤 pom引入 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional&

左岸天涯--博客 2890

Spring Boot中的STOMP Broker:原理及使用

Spring Boot中的STOMP Broker是一种用于在Web应用程序之间传递消息的代理服务器。STOMP Broker允许多个WebSocket客户端之间进行双向通信。在Spring Boot中,我们可以使用Spring WebSocket模块提供的STOMP Broker来实现WebSocket的双向通信。在STOMP Broker中,我们可以使用@MessageMapping注解来处理WebSocket消息。

it_xushixiong的博客 1600

SpringBoot集成STOMP

上一篇我们详细介绍了WebSocket作为一种全双工通信协议的基本概念、工作原理和实现方式。然而,在企业级应用或复杂系统中,仅仅使用原生WebSocket可能还不足以满足更高级的消息传递需求。这就是STOMP(Simple Text Oriented Messaging Protocol)协议发挥作用的地方。本文将深入探讨STOMP协议的本质、它与WebSocket的结合优势以及实际应用示例。

GSON的博客 1217

springboot整合stomp,并实现动态订阅

springboot整合stomp,并实现动态订阅

weixin_43983286的博客 778

Springboot 整合Websocket+Stomp协议+RabbitMQ做消息代理 实例教程

前言 如果你还没有了解过websocket,关于整合websocket的简单入门使用,可以先看看我这篇: 《SpringBoot 整合WebSocket 简单实战案例》 https://blog.youkuaiyun.com/qq_35387940/article/details/93483678 ok,若你是通过关键字搜索到该篇的,那么我清楚你想了解什么,这也是我写该篇文章的目的。 我想让所有人对springboot整合 webSocket 再也不陌生,再也怕去整合,包括使用rabbitmq等...

默默不代表沉默 1万+

Springboot 整合 WebSocket ,使用STOMP协议+Redis 解决负载场景问题(二)

前言 上一篇,简单给大家整合了一下websocket,使用stomp方式。 这篇,就是考虑到单体的服务使用websocket ,按照上一篇的整合,确实没问题。 但是如果一旦是负载多台服务的时候,那么消息就会出现丢失了。 ...

默默不代表沉默 9165

Springboot Websocket Stomp 消息订阅推送实战

闲话不扯,直奔主题。需要和web前端建立长链接,互相实时通讯,因此想到了websocket,后面随着需求的变更,需要用户订阅主题,实现消息的精准推送,发布订阅等,则想到了STOMP(Simple Text-Orientated Messaging Protocol) 面向消息的简单文本协议。

代码大师麦克拉瑞的博客 8349

YOLOv5s模型训练全流程解析:从数据准备到实战检测

本文详细解析了YOLOv5s模型训练的全流程,涵盖从环境搭建、数据准备与格式转换,到模型训练、参数调优及实战检测的完整步骤。文章提供了具体的代码示例和常见问题解决方案,旨在帮助开发者,特别是新手,高效掌握YOLOv5s模型训练的核心技术,并成功应用于实际检测任务中。

weixin_29041767的博客 331

Spring Boot 3 + Vue 3 整合 WebSocket (STOMP协议) 实现广播和点对点实时消息

文章深入介绍了Spring Boot 3整合WebSocket及Vue 3构建实时通信应用,使用STOMP协议实现连接、广播和点对点推送。提供详细代码示例,帮助读者掌握Spring Boot中WebSocket的应用。

有来技术 6319

Win11右键菜单显示更多选项设置默认展开方法

在Windows 11操作系统中,用户可能会发现右键点击桌面空白处时,弹出的菜单中仅显示“显示更多选项”,而并非直接展示所有可用的选项。这对于希望快速访问特定功能的用户来说,无疑增加了一些不便。为了优化这一体验,本文将介绍两种简单的方法,帮助用户设置Win11右键菜单,使其默认展开包含的所有选项。通过上述两种方法,用户可以轻松地将Win11右键菜单设置为默认展开所有选项,从而提高工作效率和便捷性。希望这篇文章对你有所帮助!

nntxthml的博客 1万+

ChatGPT设置密钥后Codex免手机验证:配置顺序与身份凭证复用机制

API Key 是一种用于身份识别的凭证,其核心原理是通过预配置的密钥替代交互式登录流程。在开发工具中,密钥认证优先级通常高于会话认证,当本地存在有效密钥时,工具会直接复用该凭证,从而减少重复验证环节。这种机制的技术价值在于提升开发效率与配置一致性,尤其适用于多设备切换、CI/CD 流水线及编程辅助工具等场景。以 Codex 为例,在 ChatGPT 界面提前配置 API 密钥后,Codex 启动时可读取持久化存储的密钥,避免触发手机号验证,实现身份凭证的跨入口复用。

weixin_33940469的博客 467

【分布式WebSocket - 3】SpringBoot集成STOMP协议完成私聊、群聊

STOMP 中文为“面向消息的简单文本协议”,STOMP 提供了能够协作的报文格式,以至于 STOMP 客户端可以与任何 STOMP 消息代理(Brokers)进行通信,从而为多语言,多平台和 Brokers 集群提供简单且普遍的消息协作。STOMP 协议可以建立在 WebSocket 之上,也可以建立在其他应用层协议之上。通过 Websocket建立 STOMP 连接,也就是说在 Websocket 连接的基础上再建立 STOMP 连接。最终实现如上图所示,这一点可以在代码中有一个良好的体现。

叁滴水 的博客 2614

StarCCM+ 导入STL几何模型进行仿真

通过 Import Surface Mesh 的方法导入 STL 文件进行仿真

薛定谔的alpha狗 6128

基于STOMP over Websocket协议实现实时在线通信的springboot项目

基于STOMP over Websocket协议实现实时在线通信的springboot项目springboot集成Websocket通过stomp协议实现在线通信,客户端使用sockjs与服务端通信...

书生灬今天不吃饭的博客 2756

【PointNet++】制作点云数据集使用CloudCompare进行标注

使用PointNet++复现成功后,需要训练自己的数据集。于是使用cloudcompare参照ShapeNet的数据集格式去制作,最终保存的txt文件格式为“xyz+rgb+label”,一共7列。 自己按此制作好的数据集已成功训练及推测,于是记录下来让好兄弟好姐妹们少踩坑多吃肉。

纵马踏花向自由 5713

「UG/NX」BlockUI 树列表(回调函数)

官方对树控件提供了21种回调函数,树的一些操作可以在这些回调函数中进行操作。

何曾参静谧的博客 1326

SpringBoot/Spring中建立WebSocket连接(STOMP)

STOMP协议介绍 STOMP,Streaming Text Orientated Message Protocol,是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。 它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互,类似于OpenWire(一种二进制协议)。...

zhuasheng 1万+

OpenClaw Skill 开发全攻略|2026 最新机制 + 文件处理实操,看完直接落地开发

很多新手刚接触时,会把 Skill 想得很复杂,其实大可不必。OpenClaw 中的每个 Skill,本质就是一套“能力描述 + 执行逻辑”的组合包,简单说就是“告诉 AI 你能做什么、怎么做,它就会调用你”,核心特征可以总结为这几点,好记又实用:核心载体:以文件夹为单位,不管多简单的 Skill,文件夹里都必须有 SKILL.md 文件——这是 AI 识别技能的唯一依据,少了它,再完善的代码也没用;

haolove527的专栏 7024

WebSocket(三) -- 使用websocket+stomp实现群聊功能

SpringBoot+websocket的实现其实不难,你可以使用原生的实现,也就是websocket本身的OnOpen、OnClosed等等这样的注解来实现,以及对WebSocketHandler的实现,类似于netty的那种使用方式,而且原生的还提供了对websocket的监听,服务端能更好的控制及统计(即上文实现的方式)。但是,真实项目中还是使用Stomp实现的居多,因为独立服务更方便,便于后期搭建集群环境做横向扩展,且内置的方法也很简单,既然如此,我们还是以主流实现方式为准来学习吧。

weixin_39724194的博客 2622

智能合约监控告警:提示工程架构师用AI Prompt实现精准预警

当AI大模型(尤其是代码理解模型如CodeLlama、GPT-4 Code)与区块链数据结合,智能合约监控迎来范式革新。AI模型如何精准理解智能合约的业务特殊性?如何避免"AI幻觉"导致的误报?如何让模型学会区分"正常异常"与"攻击前兆"?答案藏在"提示工程"(Prompt Engineering)中。理解特定智能合约的业务逻辑(如DeFi协议的清算机制、NFT的铸造规则)识别复杂的攻击模式(如重入攻击的调用链特征、闪电贷的套利路径)结合链上链下数据进行多维度推理(如关联价格波动与异常交易)

AI架构全栈开发实战笔记 1010

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

基于springboot的stomp与websocket实现实时消息推送与发送

一、什么是STOMP STOMP 是一个简单的面向文本的消息传递协议,最初是为Ruby,Python等脚本语言创建的。和Perl连接到企业消息代理。它旨在解决常用消息传递模式的子集。 STOMP可用于任何可靠的双向流网络协议,如TCP和WebSocket。虽然STOMP是面向文本的协议,但消息的有效负载可以是文本或二进制。 二、好处 使用STOMP作为子协议使Spring Framework和Sp...

点点的博客 5027

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: 【Vue】Vue父页面与iframe内嵌html子页面互调,传参问题
下一篇: 【Java基础】java学习之旅01-初识java
JeffHan^_^
博客等级 码龄7年 1万+粉丝 134原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JeffHan^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值