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

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 {@Overridepublic void configureMessageBroker(MessageBrokerRegistry config) {config.enableSimpleBroker("/topic");  // 主题路径前缀config.setApplicationDestinationPrefixes("/app");  // 应用路径前缀}@Overridepublic 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.mzph.cn/web/61660.shtml

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

相关文章

Kafka2.2.0集群安装

Kafka2.2.0 三节点集群搭建 Kafka2.2.0 基于zookeeper搭建&#xff0c;这里也搭建一个三个节点的集群。(在一个节点模拟三节点&#xff0c;真实的三节点把ip替换一下即可&#xff0c;按照hadoop案件把网络打通即可) 1、下载解压 Kafka 安装包官方下载地址 &#xff0c;本用例…

AD软件如何快速切换三维视图,由2D切换至3D,以及如何恢复

在Altium Designer软件中&#xff0c;切换三维视图以及恢复二维视图的操作相对简单。以下是具体的步骤&#xff1a; 切换三维视图 在PCB设计界面中&#xff0c;2D切换3D&#xff0c;快捷键按住数字键盘中的“3”即可切换&#xff1b; 快捷键ctrlf&#xff08;或者vb快捷键也…

人工智能-卷积神经网络(学习向)

一.概述&#xff1b; 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种专门用于处理具有类似网格结构的数据&#xff08;如图像&#xff09;的深度学习模型。 主要用于处理机器视觉任务。 主要功能&#xff1b; 1.图像分类 2.目标检测 3.图像分割…

ABE 中的隐藏属性:DIPPE(去中心化内积谓词加密)

1. 引言 相关论文有&#xff1a; Yan Michalevsky 和 Marc Joye 2018年论文 Decentralized policy-hiding ABE with receiver privacy&#xff0c;发表于23rd European Symposium on Research in Computer Security, ESORICS 2018。Amit Sahai 和 Brent Waters 2005年论文 Fu…

书生浦语·第四期作业合集

目录 1. Linux基础知识 1.1-Linux基础知识 1.在终端通过ssh 端口映射连接开发机 2. 创建helloworld.py 3.安装相关包并运行 4.端口映射并访问相关网页

小程序-基于java+SpringBoot+Vue的校园快递平台系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

【智商检测——DP】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e510, M 110; int f[N][M]; int main() {int n, k;cin >> n >> k;for(int i 1; i < n; i){int x;cin >> x;f[i][0] __gcd(f[i-1][0], x);for(int j 1; j < min(i, k)…

使用flex布局实现一行固定展示n个元素

前言&#xff1a; 最近在公司中完成小程序的UI设计稿时&#xff0c;遇到了布局一个问题&#xff1a;UI设计稿想实现的布局是这样的&#xff1a; 笔者第一反应就是使用flex中的justify-content: space-between;属性&#xff0c;但是使用之后发现&#xff0c;justify-content: …

AntFlow 0.20.0版发布,增加多数据源多租户支持,进一步助力企业信息化,SAAS化

传统老牌工作流引擎比如activiti,flowable或者camunda等虽然功能强大&#xff0c;也被企业广泛采用&#xff0c;然后也存着在诸如学习曲线陡峭&#xff0c;上手难度大&#xff0c;流程设计操作需要专业人员&#xff0c;普通人无从下手等问题。。。引入工作流引擎往往需要企业储…

IDL学习笔记(一)数据类型、基础运算、控制语句

近期&#xff0c;需要用到modis数据批量预处理&#xff0c;于是重新学习idl,感谢郭师兄推荐&#xff0c;以及张洋老师的详细教导。特以此为学习笔记&#xff0c;望学有所成。 IDL学习笔记&#xff08;一&#xff09; 数据类型数据类型创建数组类型转换函数代码输出print往文件…

【实体配置】.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 系列【数据事务…

使用 Pytorch 构建 Vanilla GAN

文章目录 一、说明二、什么是 GAN&#xff1f;三、使用 PyTorch 的简单 GAN&#xff08;完整解释的代码示例&#xff09;3.1 配置变量3.2 、PyTorch 加速3.3 构建生成器3.4 构建鉴别器 四、准备数据集五、初始化函数六、前向和后向传递七、执行训练步骤八、结果 一、说明 使用…

Python酷库之旅-第三方库Pandas(251)

目录 一、用法精讲 1186、pandas.tseries.offsets.BusinessMonthEnd.is_year_start方法 1186-1、语法 1186-2、参数 1186-3、功能 1186-4、返回值 1186-5、说明 1186-6、用法 1186-6-1、数据准备 1186-6-2、代码示例 1186-6-3、结果输出 1187、pandas.tseries.offs…

爬虫专栏第二篇:Requests 库实战:从基础 GET 到 POST 登录全攻略

简介&#xff1a;本文聚焦 Requests 库的强大功能与应用实战。首先介绍其安装步骤及版本选择要点&#xff0c;随后深入讲解 GET 请求&#xff0c;以百度页面为例&#xff0c;展示如何发起基本 GET 请求、巧妙添加 headers 与参数以精准搜索&#xff0c;以及正确设置 encoding 避…

猎板 PCB特殊工艺:铸就电子行业核心竞争力新高度

在当今竞争激烈且技术驱动的电子制造领域&#xff0c;印制电路板&#xff08;PCB&#xff09;作为电子产品的关键基石&#xff0c;其特殊工艺的发展水平直接影响着整个行业的创新步伐与产品品质。猎板 PCB 凭借在厚铜板、孔口铺铜、HDI 板、大尺寸板以及高频高速板等特殊工艺方…

基于K-NN + GCN的轴承故障诊断模型

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…

【Gitlab】CICD使用minio作为分布式缓存

1、安装minio 下载适合自己系统版本的安装文件https://dl.min.io/server/minio/release/windows-amd64/ yum install xxx.rpm 2、配置/etc/profile export MINIO_ACCESS_KEYroot [ui登录账号] export MINIO_SECRET_KEYminioDev001 [ui登录密码] export MINIO_OPTS"…

手机卡限速丨中国移动5G变3G,网速500kb

以下猜测错误&#xff0c;又有新的猜测&#xff1a;河南移动的卡出省限速。可能是因为流量结算。 “2024年7月1日起&#xff0c;中国移动集团内部将开启跨省流量结算” 在深圳四五年了&#xff0c;之前没有过&#xff0c;就从上个月开始。11月底解除限速&#xff0c;12月刚开…

JavaScript根据数据生成柱形图

分析需求 // 定义一个数组来存储四个季度的数据 dataArray = []// 循环4次,获取用户输入的数据并存储到数组中 for i from 0 to 3// 获取用户输入的数据inputData = 获取用户输入的第(i + 1)季度的数据// 将数据存入数组dataArray[i] = inputData// 遍历数组,根据数据生成柱…

No module named ‘huggingface_hub‘

问题描述 from huggingface_hub import PyTorchModelHubMixin ModuleNotFoundError: No module named huggingface_hub解决方法 pip install huggingface_hub