JAVA:Springboot 集成 WebSocket 和 STOMP 实时消息的技术指南

news2025/1/14 22:07:17

1、简述

随着互联网应用的复杂性和实时性需求的增加,传统的 HTTP 请求响应模式已不能满足某些场景的需求。WebSocket 和 STOMP 协议为构建实时消息传输提供了极大的便利。本文将介绍如何在 Spring Boot 中使用 WebSocket 和 STOMP 创建一个实时消息应用,并通过实例展示其实现过程。

在这里插入图片描述

2、工作原理

2.1 WebSocket

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。与传统的 HTTP 不同,WebSocket 在客户端与服务器之间建立连接后,可以在不关闭连接的情况下,进行双向数据传输。这使得 WebSocket 成为实现实时应用程序(如聊天应用、实时通知等)的理想选择。

2.2 STOMP

STOMP(Simple/Streaming Text Oriented Messaging Protocol)是一个简单的消息传递协议,通常用于 WebSocket 上层,以实现基于消息的通信。STOMP 协议定义了如何订阅主题、发送消息等操作,非常适合在 WebSocket 环境中使用。

2.3 WebSocket 和 STOMP 的工作原理
  • 客户端建立 WebSocket 连接:客户端通过 WebSocket 连接到服务器,并订阅感兴趣的主题(topics)。
  • 消息发布与订阅:当服务器有新的消息时,会根据消息主题将消息推送给订阅该主题的客户端。
  • 双向通信:WebSocket 允许服务器和客户端之间进行双向通信,客户端也可以通过 WebSocket 发送消息到服务器。
    在这里插入图片描述

3、集成

3.1 引入依赖

在 Spring Boot 项目中使用 WebSocket 和 STOMP,首先需要在 pom.xml 中添加相关依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
3.2 配置 WebSocket 和 STOMP

接下来,需要创建 WebSocket 配置类,启用 STOMP 消息代理:

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");  // 主题路径前缀
        config.setApplicationDestinationPrefixes("/app");  // 应用路径前缀
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").withSockJS();  // WebSocket 连接路径
    }
}

在这个配置中,/topic 表示消息主题的路径前缀,/app 表示应用消息发送路径前缀,/ws 则是 WebSocket 连接的端点。

3.3 创建消息处理器

接下来,我们需要创建一个消息处理器类,用于接收和处理来自客户端的消息:

import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

@Controller
public class MessageController {

    @MessageMapping("/sendMessage")  // 接收客户端消息
    @SendTo("/topic/messages")  // 广播到主题
    public Message send(Message message) {
        // 处理消息的逻辑
        return message;  // 返回的消息将广播到所有订阅者
    }
}

这里的 @MessageMapping(“/sendMessage”) 表示接收客户端发送到 /app/sendMessage 的消息,并将处理后的消息广播到 /topic/messages 主题上,所有订阅了该主题的客户端将收到消息。

3.4 创建消息模型

定义一个简单的消息模型类,用于传递消息数据:

import lombok.Data;

@Data
public class Message {
    private String from;
    private String text;

    // Getters and Setters
}
3.5 编写前端代码

在前端(如使用 JavaScript)中,可以使用 SockJS 和 Stomp.js 来连接 WebSocket 并订阅消息:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>WebSocket Demo</title>
    <script src="https://cdn.jsdelivr.net/npm/sockjs-client@1.5.1/dist/sockjs.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/stompjs@2.3.3/lib/stomp.min.js"></script>
</head>
<body>
    <div id="chat">
        <input type="text" id="message" placeholder="Enter your message"/>
        <button onclick="sendMessage()">Send</button>
        <ul id="messages"></ul>
    </div>

    <script type="text/javascript">
        var stompClient = null;

        function connect() {
            var socket = new SockJS('/ws');
            stompClient = Stomp.over(socket);
            stompClient.connect({}, function (frame) {
                console.log('Connected: ' + frame);
                stompClient.subscribe('/topic/messages', function (message) {
                    showMessage(JSON.parse(message.body));
                });
            });
        }

        function sendMessage() {
            var messageContent = document.getElementById("message").value;
            stompClient.send("/app/sendMessage", {}, JSON.stringify({'text': messageContent, 'from': 'User'}));
        }

        function showMessage(message) {
            var messages = document.getElementById("messages");
            var messageElement = document.createElement('li');
            messageElement.appendChild(document.createTextNode(message.from + ": " + message.text));
            messages.appendChild(messageElement);
        }

        connect();
    </script>
</body>
</html>

在这个示例中,用户可以输入消息并通过 WebSocket 发送到服务器,服务器处理后再将消息广播到所有订阅该主题的客户端。

4、扩展功能

  • 私信功能:可以通过实现点对点消息发送,利用 STOMP 的 /user 目标。
  • 在线用户列表:通过 WebSocket 连接与断开时的事件处理,可以实时显示当前在线的用户列表。
  • 消息持久化:将消息保存到数据库中,实现聊天记录的持久化。

5、总结

本文详细介绍了如何在 Spring Boot 项目中集成 WebSocket 和 STOMP,构建一个简单的实时消息应用。通过 WebSocket 的双向通信能力和 STOMP 协议的消息传递机制,可以轻松实现各种实时功能,如聊天室、实时通知系统等。

实时消息传输是现代互联网应用的重要特性,了解并掌握 WebSocket 和 STOMP 能帮助你在项目中实现更高效的实时通信功能。

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

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

相关文章

华为仓颉编程环境搭建

1、仓颉介绍 摘自华为官方&#xff1a;仓颉编程语言作为一款面向全场景应用开发的现代编程语言&#xff0c;通过现代语言特性的集成、全方位的编译优化和运行时实现、以及开箱即用的 IDE 工具链支持&#xff0c;为开发者打造友好开发体验和卓越程序性能。 其具体特性表现为&am…

Vue+Elementui el-tree树只能选择子节点并且支持检索

效果&#xff1a; 只能选择子节点 添加配置添加检索代码 源码&#xff1a; <template><div><el-button size"small" type"primary" clearable :disabled"disabled" click"showSign">危险点评估</el-button>…

【前端】安装hadoop后,前端启动报错,yarn命令

新安装hadoop后&#xff0c;前端启动项目用yarn命令&#xff0c;报错。 报错&#xff1a;系统找不到指定的路径。 No HADOOP_CONF_DIR set. Please specify it either in yarn-env.cmd or in the environment. 解决&#xff1a;删掉hadoop目录下yarn的文件 检查&#xff1a;…

【数据事务】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

【381】基于springboot的银行客户管理系统

摘 要 伴随着信息技术与互联网技术的不断发展&#xff0c;人们进到了一个新的信息化时代&#xff0c;传统管理技术性没法高效率、容易地管理信息内容。为了实现时代的发展必须&#xff0c;提升管理高效率&#xff0c;各种各样管理管理体系应时而生&#xff0c;各个领域陆续进到…

VUE前端实现天爱滑块验证码--详细教程

第一步&#xff1a; Git地址&#xff1a;tianai-captcha-demo: 滑块验证码demo 找到目录 src/main/resources/static,拷贝 static 并改名为 tac 即可。 第二步&#xff1a; 将改为 tac 的文件&#xff0c;放进项目根目录中&#xff0c;如下图&#xff1a; 第三步&#xff1…

Profinet转EtherNet/IP网关是如何解决西门子S7-1500PLC与AB PLC的通讯问题的

一、 案例背景 在一个工业现场&#xff0c;一端是AB的PLC&#xff0c;IP地址192.168.1.20;另一端西门子是S7-1500系列&#xff0c;IP地址192.168.2.248。AB的PLC内有 B3、N7、F8 三个寄存器文件涉及到通讯&#xff0c;分别对应西门子PLC的M、DB1、DB2三个存储区域。通过捷米特…

SpringCloud Seata集成分布式事务管理 事务保护 XA AT两种模式的区别

介绍 阿里巴巴的 Seata&#xff08;Service Aligned Transaction Alternative&#xff09;是一个开源的分布式事务解决方案&#xff0c;旨在解决微服务架构中跨服务、跨数据库的事务一致性问题。它可以帮助开发者管理分布式系统中的全局事务&#xff0c;确保在多个服务之间的事…

java全栈day10--后端Web基础(基础知识)之续集

一、Servlet执行流程 二、Http协议&#xff08;相对Tomcat和servlet重要一点&#xff09; 2.1Http-概叙 2.2Http-请求协议 2.2.3请求数据格式 2.2.3请求数据获取 先启动服务器 访问/hello Servlet 访问浏览器端Http协议数据 查看数据 如何获取具体说明&#xff1a; 代码演示 …

【Python】ASCII-generator 将图像、文本或视频转换为 ASCII 艺术 生成字符图(测试代码)

目录 预览效果安装环境报错分析基本例程总结 欢迎关注 『Python』 系列&#xff0c;持续更新中 欢迎关注 『Python』 系列&#xff0c;持续更新中 预览效果 原图 黑白图 彩色图 安装环境 拉取代码 https://github.com/vietnh1009/ASCII-generatorpython3.8 pip install…

2024年大热,Access平替升级方案,也适合Excel用户

欢迎各位看官&#xff0c;您来了&#xff0c;就对了&#xff01; 您多半是Access忠实粉丝&#xff0c;至少是excel用户&#xff0c;亦或是WPS用户吧。那就对了&#xff0c;今天的分享肯定对您有用。 本文1100字&#xff0c;阅读时长2分50秒&#xff01; 现实总是不尽人意&am…

SpringMVC:入门案例

从此开始&#xff0c;我们步入SpringMVC的学习。 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架 先来看一下web程序是如何工作的&#xff1a; 因为是异步调用&#xff0c;所以后端不需要返回view视图&#xff0c;将其去除前端如果通过异步调用的方式进行交互&#xff0…

云计算实验室建设方案

一、云计算实验室建设方案 云计算实验教学整体解决方案&#xff0c;包括&#xff1a;云计算服务器集群、云计算实训平台、实训课程体系、行业实战课程系统、行业数据等&#xff0c;系统性地解决云计算实训教学的痛点问题。 【硬件系统】云计算实训一体机 云计算实训一体机是唯…

QT基础学习day1

一&#xff0c;QT介绍 1.1&#xff0c;什么是 Qt Qt 是一个跨平台的 C\python图形用户界面应用程序框架。 它为应用程序开发者提供建立艺术级图形界面所需的所有功能。 它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。 1.1 &#xff0c;Py…

LabVIEW内燃机气道试验台测控系统

基于LabVIEW软件开发的内燃机气道试验台测控系统主要应用于内燃机气道的性能测试和数据分析&#xff0c;通过高精度的测控技术&#xff0c;有效提升内燃机的测试精度和数据处理能力。 项目背景 随着内燃机技术的发展&#xff0c;对其气道性能的精准测量需求日益增加。该系统通…

MAUI APP开发蓝牙协议的经验分享:与跳绳设备对接

在开发MAUI应用程序时&#xff0c;蓝牙协议的应用是一个重要的环节&#xff0c;尤其是在需要与外部设备如智能跳绳进行数据交换的场景中。以下是我在开发过程中的一些经验和心得&#xff0c;希望能为你的项目提供帮助。 1. 蓝牙协议基础 蓝牙协议是无线通信的一种标准&#x…

centos7调用so库无响应

这里使用centos7部署一个springboot项目调用so库函数时&#xff0c;无任何响应与输出、也无任何报错信息。以下是我使用的服务器信息&#xff1a; 解决方法&#xff1a; 这里我先直接说下解决方法。有效的解决方法是将你的 so 库文件上传至服务器的 lib 目录中&#xff0c;并对…

使用 PDF API 合并 PDF 文件

内容来源&#xff1a; 如何在 Mac 上合并 PDF 文件 1. 注册与认证 您可以注册一个免费的 ComPDFKit API 帐户&#xff0c;该帐户允许您在 30 天内免费无限制地处理 1,000 多个文档。 ComPDFKit API 使用 JSON Web Tokens 方法进行安全身份验证。从控制面板获取您的公钥和密钥&…

多线程相关案例

目录 1. 单例模式 1) 饿汉模式 2) 懒汉模式 2. 阻塞队列 1) 阻塞队列的特性 2) 模拟实现阻塞队列 3. 定时器 4. 线程池 1) ThreadPoolExecutor 类 2) 模拟实现线程池 1. 单例模式 单例模式是最经典的设计模式之一。 单例模式&#xff0c;顾名思义&#xff0c;就是这…

【PyQt入门】麦当劳会员登录页面实战

PyQt思维导图&#xff1a; 效果图如下&#xff1a; 设计页面包含&#xff1a;图标&#xff08;含动图gif&#xff09;&#xff0c;窗口logo&#xff0c;title&#xff0c;文本框&#xff0c;按钮 素材图如下&#xff1a; 完整代码以及标注如下&#xff1a; # 导入必要的PyQt6…