Spring Boot 中的 STOMP 是什么,原理,如何使用

news2025/2/21 22:02:40

Spring Boot 中的 STOMP 是什么,原理,如何使用

介绍

在 Spring Boot 中,STOMP 是一种简单的文本协议,用于在客户端和服务器之间进行实时消息传递。它是 WebSocket 协议的一种扩展,可以在 WebSocket 上运行。在本文中,我们将介绍 Spring Boot 中的 STOMP 是什么,其原理以及如何使用它来实现实时消息传递。

在这里插入图片描述

STOMP 是什么

STOMP(Simple Text Oriented Messaging Protocol)是一种简单的文本协议,用于在客户端和服务器之间进行实时消息传递。它是一种基于文本的协议,易于理解和使用。STOMP 是 WebSocket 协议的一种扩展,可以在 WebSocket 上运行。在 Spring Boot 中,STOMP 是通过 Spring WebSocket 模块来实现的。

STOMP 的原理

在 Spring Boot 中,STOMP 是通过 WebSocket 进行实现的。WebSocket 是一种双向通信协议,可以在客户端和服务器之间建立持久化的连接。在 WebSocket 连接建立后,客户端和服务器之间可以通过发送和接收消息来进行实时通信。

在 STOMP 中,客户端和服务器之间使用 STOMP 帧进行通信。STOMP 帧由命令、标头和正文组成。命令指定帧的类型,标头包含一些元数据,正文包含实际的消息数据。

在 Spring Boot 中,STOMP 可以与控制器一起使用。控制器可以接收和处理 STOMP 帧,并将结果返回给客户端。以下是一个简单的 STOMP 控制器示例:

@Controller
public class MyController {
 
    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message) throws Exception {
        Thread.sleep(1000); // simulated delay
        return new Greeting("Hello, " + message.getName() + "!");
    }
 
}

在上面的代码中,我们使用 @MessageMapping 注释将控制器方法映射到 “/hello” 目的地。当客户端发送消息到 “/hello” 目的地时,控制器方法将被调用,并返回一个 Greeting 对象。控制器方法中的 @SendTo 注释将 Greeting 对象发送到 “/topic/greetings” 目的地,以便所有订阅了该目的地的客户端都能够接收到消息。

如何使用 STOMP

在 Spring Boot 中,STOMP 可以与 Spring WebSocket 模块一起使用。要使用 STOMP,需要在应用程序中添加 Spring WebSocket 依赖项。例如,以下是一个使用 STOMP 的示例:

添加 Maven 依赖

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

配置 WebSocket

在 Spring Boot 中,可以通过继承 AbstractWebSocketMessageBrokerConfigurer 类来配置 WebSocket。以下是一个简单的 WebSocket 配置示例:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
 
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }
 
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/gs-guide-websocket").withSockJS();
    }
 
}

在上面的代码中,我们使用 @EnableWebSocketMessageBroker 注释启用 WebSocket 消息代理,并重写了 configureMessageBroker() 和 registerStompEndpoints() 方法。configureMessageBroker() 方法配置了消息代理,指定了 “/topic” 目的地作为简单代理的目标。registerStompEndpoints() 方法注册了 HTTP 监听器,并指定了 “/gs-guide-websocket” 作为 WebSocket 的端点。

创建 STOMP 控制器

在 Spring Boot 中,可以使用 @MessageMapping 注释来将控制器方法映射到 STOMP 消息目的地。以下是一个简单的 STOMP 控制器示例:

@Controller
public class MyController {
 
    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message) throws Exception {
        Thread.sleep(1000); // simulated delay
        return new Greeting("Hello, " + message.getName() + "!");
    }
 
}

在上面的代码中,我们使用 @MessageMapping 注释将控制器方法映射到 “/hello” 目的地。当客户端发送消息到 “/hello” 目的地时,控制器方法将被调用,并返回一个 Greeting 对象。控制器方法中的 @SendTo 注释将 Greeting 对象发送到 “/topic/greetings” 目的地,以便所有订阅了该目的地的客户端都能够接收到消息。

创建客户端

要在客户端使用 STOMP,可以使用 STOMP 客户端库。以下是一个简单的 STOMP 客户端示例:

var socket = new SockJS('/gs-guide-websocket');
var stompClient = Stomp.over(socket);

stompClient.connect({}, function(frame) {
    console.log('Connected: ' + frame);
    stompClient.subscribe('/topic/greetings', function(greeting) {
        console.log('Received: ' + greeting.body);
    });
});

function sendName() {
    var name = document.getElementById('name').value;
    stompClient.send("/app/hello", {}, JSON.stringify({ 'name': name }));
}

在上面的代码中,我们使用 SockJS 和 STOMP 客户端库来创建一个连接到 “/gs-guide-websocket” 端点的 WebSocket。在连接成功后,我们使用 stompClient.subscribe() 方法订阅 “/topic/greetings” 目的地,以便接收从服务器发送的消息。在 sendName() 方法中,我们使用 stompClient.send() 方法向服务器发送消息。

总结

在本文中,我们介绍了 Spring Boot 中的 STOMP 是什么,其原理以及如何使用它来实现实时消息传递。我们了解了 STOMP 的基本原理,并演示了如何创建一个 STOMP 控制器和客户端。使用 STOMP,可以轻松地实现实时消息传递,并提供了一个简单易用的文本协议,方便开发人员进行开发和调试。

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

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

相关文章

Electron + ts + vue3 + vite 项目搭建

新建一个vite ts vue3的项目 在创建选项中选择ts和vue选项。 之后&#xff0c;安装依赖之后试运行一下&#xff0c;出现一下页面意味着vite-vue项目创建成功。 npm create vitelatest electron-vue3-ts-vite-test1 VSCode打开electron-vue3-ts-vite-test1或者cd electron-…

vue项目运行后使用ip地址在手机上打开

文章目录 1、获取ip地址2、保证你的手机和电脑使用的是一个wifi3、修改配置文件 1、获取ip地址 windowr&#xff0c;输入cmd按回车后在输入ipconfig ipv4地址就是你了 2、保证你的手机和电脑使用的是一个wifi 3、修改配置文件 &#xff08;1&#xff09;vue.config.js文件中…

大数据时代,商业智能BI的使用规则

商业智能BI的火热程度让很多不了解的企业也在内部部署了BI系统&#xff0c;怎么利用BI创造价值也就成了新的问题。 商业智能面向管理人员 很多人其实不理解&#xff0c;为什么说企业的管理人员想要完全了解企业的各项业务发展情况实际上是很困难的。 一家企业有这么多部门&a…

【redis】stream消息队列

目录 截图一、代码示例1.1 pom.xml依赖1.2 application.xml配置1.3 启动类1.4 配置类1.5 消息实体1.6 自定义错误1.7 自定义注解1.8 服务类1.9 监听类1.10 controller 截图 一、代码示例 1.1 pom.xml依赖 <?xml version"1.0" encoding"UTF-8"?> …

Unity VR:XR Interaction Toolkit 官方 Demo

Unity XR Interaction Toolkit 提供了一个官方 Demo&#xff0c;包含了丰富的功能演示&#xff0c;可以供大家更好地学习 VR 开发。 项目地址&#xff1a;https://github.com/Unity-Technologies/XR-Interaction-Toolkit-Examples 项目里包括多个演示场景&#xff0c;而 XRI_…

Unity 中 TextMeshPro 字体位置偏上/偏下

问题&#xff1a;在Unity中创建了一个新的TextMeshPro 字体&#xff0c;在使用的时候布局设置的居中对齐&#xff0c;但在场景中实际位置却和预期位置不服&#xff0c;如下图。 当然通过调整布局设置&#xff0c;也可以显示成正常的效果&#xff0c;但不可能所有文本都通过这…

element栅格自定义等分

由于element栅格组件是 24 分栏&#xff0c;所以当我们需要5、7、9等分时&#xff0c;就不好实现 <template><el-row><el-col :span"24">1</el-col></el-row><el-row><el-col :span"12">2</el-col><e…

【Java可执行命令】(三)API文档生成工具javadoc: 深入解析Java API文档生成工具javadoc ~

Java可执行命令详解之javadoc 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.1.1 可选参数&#xff1a;-d < directory>3.1.2 可选参数&#xff1a;-sourcepath < pathlist>3.1.3 可选参数&#xff1a;-classpath < pathlist>3.1.4 可选参数&#xff1…

JTAG 、 SWD 和 J-Link、ST-Link

JTAG和SWD的区别与联系JTAG接口SWD接口JTAG和SWD的区别与联系J-Link和ST-LinkJ-LINK仿真器STLINK仿真器JLINK和STLINK的比较与选择 JTAG和SWD的区别与联系 JTAG和SWD是两种常用的用于调试和编程ARM微控制器的接口&#xff0c;它们都可以通过调试器&#xff08;如ST-LINK或J-Li…

插入排序——希尔排序

希尔排序其实就是一种插入排序&#xff0c;实际上就是通过直接插入排序一步步改进优化而实现的。所以在了解希尔排序之前要明白插入排序的实现原理。 插入排序 其实我觉得插入排序也可以叫做摸牌排序&#xff0c;就是从第二张牌开始处理&#xff0c;将摸到的牌按照合适的顺序插…

音频分析仪-测试

底噪&#xff1a; 有效值&#xff1a; ** 增益&#xff1a; ** ** 延时-脉冲响应 **

基于Java+Swing+Mysql影院售票系统

基于JavaSwingMysql影院售票系统 一、系统介绍二、功能展示1.主页2.新增影片信息3.删除影片信息 三、数据库四、其他系统实现五、获取源码 一、系统介绍 该系统实现了查看影片列表、新增影片信息、删除影片信息 运行环境&#xff1a;eclipse、idea、jdk1.8 二、功能展示 1.…

大环境之下软件测试行业趋势能否上升?

如果说&#xff0c;2022年对于全世界来说&#xff0c;都是一场极大的挑战的话&#xff1b;那么&#xff0c;2023年绝对是机遇多多的一年。众所周知&#xff0c;随着疫情在全球范围内逐步得到控制&#xff0c;无论是国际还是国内的环境&#xff0c;都会呈现逐步回升的趋势&#…

Java教程-Java异常传播

异常首先从调用堆栈的顶部抛出&#xff0c;如果没有被捕获&#xff0c;它会向下传递到前一个方法。如果在那里没有被捕获&#xff0c;异常会再次向下传递到前一个方法&#xff0c;依此类推&#xff0c;直到它们被捕获或者达到调用堆栈的最底部。这被称为异常传播。 异常传播示例…

Beego之Bee安装以及创建,运行项目

一.简介 Bee是什么&#xff1f; bee工具是一个为了协助快速开发 Beego 项目而创建的项目&#xff0c;通过 bee 可以很容易的进行 Beego 项目的 创建、热编译、开发、测试和部署 Beego中文文档 Beego中文文档: Beego简介 安装前提 在安装bee之前&#xff0c;首先得提前安装好Go的…

5.6.1 端口及套接字

5.6.1 端口及套接字 传输层的作用是在通信子网提供服务的基础之上为它的上层也就是应用进程提供端到端的传输服务&#xff0c;通信子网是由用作信息交换的网络节点和通信线路所组成的独立的数据通信系统。它承担着全网的数据传输、转接和加工变换等通信处理工作。如图 通信子网…

【前端工程化】Verdaccio搭建本地npm仓库

背景 Verdaccio 是一个 Node.js创建的轻量的私有npm proxy registry 我们在开发npm包的时候&#xff0c;经常需要验证发包流程&#xff0c;或者开发的npm包仅局限于公司内部使用时&#xff0c;就可以借助Verdaccio搭建一个npm仓库&#xff0c;搭建完之后&#xff0c;只要更改np…

力扣 700. 二叉搜索树中的搜索

题目来源&#xff1a;https://leetcode.cn/problems/search-in-a-binary-search-tree/description/ C题解1&#xff1a;二叉搜索树&#xff0c;右节点大于当前节点&#xff0c;左右节点小于当前节点&#xff0c;因此可以根据当前节点值与目标值的大小比较进行搜索。 class Sol…

【CSS】鼠标(移入/移出)平滑(显示/隐藏)下划线

文章目录 效果展示实现步骤1. 添加背景颜色2. 修改背景颜色3. 调整背景的大小4. 取消背景重复绘制5. 调小高度6. 设置背景绘制位置7. 隐藏背景8. 加入鼠标移入事件9. 平滑显示/隐藏下划线10. 调整一下背景图的位置11. 调整鼠标移入时进入的位置 效果展示 鼠标移入内容时&#…

基于matlab使用二维规范化互相关进行模式匹配和目标跟踪(附源码)

一、前言 此示例演示如何使用二维规范化互相关进行模式匹配和目标跟踪。该示例使用预定义或用户指定的目标以及要跟踪的类似目标的数量。归一化互相关图显示&#xff0c;当值超过设置的阈值时&#xff0c;将标识目标。 在此示例中&#xff0c;您使用规范化互相关来跟踪视频中…