Spring Boot实践:构建WebSocket实时通信应用程序并创建订阅端点

news/2024/4/25 13:20:55/文章来源:https://blog.csdn.net/qq_28245087/article/details/130335674

作为一款流行的Java开发框架,Spring Boot可以轻松地集成WebSocket。WebSocket能够为Web应用程序提供实时通信功能,而Spring Boot的优秀特性使得它可以很容易地实现WebSocket的集成。在本篇文章中,我们将演示如何使用Spring Boot框架来构建一个简单的WebSocket应用程序。

1. 创建Spring Boot项目

首先,我们需要创建一个新的Spring Boot项目。可以使用Spring Initializr来生成一个基于Maven或Gradle的项目结构。在项目生成页面中,我们需要选择以下的选项:

  • 项目类型:Maven或Gradle,根据自己的偏好选择
  • 语言:Java
  • Spring Boot版本:最新版本
  • 项目元数据:根据个人喜好填写

2. 集成WebSocket

要在Spring Boot应用程序中使用WebSocket,我们需要添加Spring的WebSocket模块依赖。在Maven项目中,可以在pom.xml文件中添加以下依赖:

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

在Gradle项目中,可以在build.gradle文件中添加以下依赖:

dependencies {implementation 'org.springframework.boot:spring-boot-starter-websocket'
}

3. 创建WebSocket端点

一旦我们集成了WebSocket模块,就可以开始创建WebSocket端点了。WebSocket端点是实际处理来自客户端连接的请求的地方。在Spring Boot中,我们可以使用@ServerEndpoint注释来定义WebSocket端点。
在本示例中,我们将创建一个简单的WebSocket端点,在订阅时向客户端发送一条欢迎消息,并在接收到消息时将其广播给所有已连接的客户端。以下是实现这些功能的代码:

import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;@ServerEndpoint("/")
@Component
public class WebSocketEndpoint {private static Set<Session> sessions = Collections.synchronizedSet(new HashSet<>());@OnOpenpublic void onOpen(Session session) {sessions.add(session);sendWelcomeMessage(session);}@OnClosepublic void onClose(Session session) {sessions.remove(session);}@OnMessagepublic void onMessage(String message, Session session) throws IOException {broadcast(message, session);}private void sendWelcomeMessage(Session session) {try {session.getBasicRemote().sendText("Welcome to the WebSocket example!");} catch (IOException ex) {ex.printStackTrace();}}private void broadcast(String message, Session senderSession) throws IOException {for (Session session : sessions) {if (!session.equals(senderSession)) {session.getBasicRemote().sendText(message);}}}
}

如上所述,我们定义了一个名为WebSocketEndpoint的类,并使用@ServerEndpoint注释标注。该类还使用了@Component注释,以使得Spring Boot可以自动将其实例化和管理。
我们还实现了三个方法:onOpen、onClose和onMessage。在onOpen方法中,我们将新连接的会话添加到会话集合中,并向该会话发送欢迎消息。在onClose方法中,我们将终止的会话从会话集合中删除。在onMessage方法中,我们将收到的消息广播给所有连接的客户端,除了发送该消息的客户端之外。

4. 创建订阅端点

在本示例中,我们将创建一个简单的订阅端点,客户端可以使用该端点来订阅来自WebSocket端点的消息。以下是订阅端点的实现代码:

import java.io.IOException;
import javax.websocket.OnMessage;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;@ServerEndpoint("/subscribe")
@Component
public class SubscribeEndpoint {@OnMessagepublic void onMessage(String message, Session session) throws IOException {//TODO: subscribe to WebSocketEndpoint messages}
}

如上所述,我们定义了一个名为SubscribeEndpoint的类,并使用@ServerEndpoint注释标注。该类还使用了@Component注释。
我们在SubscribeEndpoint中实现了onMessage方法,该方法可以处理客户端发送的订阅请求。在真实的应用程序中,我们可能会实现更复杂的订阅逻辑,例如在后台与其他系统交互以获取实时数据。

5. 测试

一旦我们创建了WebSocket端点和订阅端点,我们可以开始测试我们的实现了。我们可以使用任何WebSocket客户端,例如浏览器中的JavaScript WebSocket API,来访问WebSocket端点。
要在浏览器中测试WebSocket端点,我们只需编写以下JavaScript代码:

let ws = new WebSocket("ws://localhost:8080");
ws.onmessage = function(event) {console.log("Received message: " + event.data);
};
ws.send("Hello, server!");

如上所述,我们使用WebSocket的构造函数来创建WebSocket连接,并指定WebSocket端点的URL。我们还使用WebSocket对象的onmessage事件处理程序来处理从服务器接收的消息,并使用WebSocket对象的send方法来发送消息。
我们还可以使用任何WebSocket客户端来测试SubscribeEndpoint。要测试SubscribeEndpoint,我们只需将订阅请求发送到订阅端点,如下所示:

let ws = new WebSocket("ws://localhost:8080/subscribe");
ws.send("subscribe!");

在真实的应用程序中,我们将使用更复杂的订阅逻辑来获取实时数据并显示在页面上。

总结

通过本文,我们学习了如何在Spring Boot中集成WebSocket,并创建了一个简单的WebSocket应用程序,该应用程序可以向客户端发送欢迎消息,并广播所有来自客户端的消息给所有连接的客户端。我们还创建了一个简单的订阅端点,以便WebSocket客户端可以使用该端点来订阅消息。

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

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

相关文章

基于TensorRT的yolov5 实例分割部署

yolov5-7.0 github: https://github.com/ultralytics/yolov5/tree/master 1. 代码的使用 1.1 训练yolov5-seg模型 使用的yolov5-7.0的代码,github下载:https://github.com/ultralytics/yolov5/releases/tag/v7.0 训练指令 python segment/train.py --data coco128-seg.y…

centos7 查看服务器配置信息

1.linux查看版本当前操作系统发行信息 cat /etc/centos-release cat /etc/centos-release 2、查看内核版本uname -a或者cat /proc/version 3、查看CPU参数 1&#xff09;、查看 CPU 物理个数   grep physical id /proc/cpuinfo | sort -u | wc -l 2&#xff09;、查看 CPU …

SpringCloud:ElasticSearch之DSL查询文档

elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c;一般测试用。例如…

magento webapi 接口返回 json对象

前言 现在主流的项目开发都是前后端分离&#xff0c;数据通过json对象格式进行传输。但是magento框架&#xff0c;和传统PHP框架相比&#xff0c;区别很大。虽然也支持以RestApi的形式传输数据&#xff0c;但是要么格式并非是传统jsonObject要么就是需要大量的get、set方法。本…

关于xilinx使用PCIE实现FPGA的部分重配置实现(MCAP)

平台&#xff1a;vivado21018.3 芯片&#xff1a;xcku115-flva1517-2-i (active) 本文官方文档&#xff1a;Xilinx_Answer_64761_Ultrascale_Devices 本文驱动下载地址&#xff1a;64761 - Bitstream Loading across the PCI Express Link in UltraScale and UltraScale Dev…

JAVA——线程池

目录 一、线程池的概念 二、Java标准库中的线程池 三、ThreadPoolExecutor 类的参数 四、线程池的拒绝策略 五、模拟实现线程池 一、线程池的概念 线程池顾名思义就是集中存储线程的地方——联想一下水池。 线程池是一种多线程处理形式&#xff0c;处理过程中将任务添加到…

Ext4日志优化-iJournaling

背景 这几年随着SSD等高性能介质的普及&#xff0c;及其在大规模分布式存储系统上的应用。基于Append only的日志写入技术也应用得越来越多&#xff0c;这几天刚好有空&#xff0c;重读了Ext4文件系统的日志部分的内容&#xff0c;也正好看到一篇对Ext4日志技术进行优化的论文…

《编码——隐藏在计算机软硬件背后的语言》精炼——第11章(门)

“The only source of knowledge is experience.” - Albert Einstein 引言 编码是一种处理并表达信息的方式&#xff0c;它包括摩斯电码、盲文、二进制语言等等&#xff0c;当然作为计算机类的经典书籍&#xff0c;这本书简述了计算机中以二进制数为基础的编码方式&#xff0…

nginx简单介绍

文章目录 1. 下载并解压2. 80端口被占用&#xff0c;更改nginx默认的监听端口3. 访问nginx4. 在linux上安装nginx5. nginx常用命令6. nginx.conf 1. 下载并解压 官网下载 2. 80端口被占用&#xff0c;更改nginx默认的监听端口 更改conf/nginx.conf文件 3. 访问nginx ht…

【Linux】popen pclose接口介绍

本篇文章简单讲述了c语言接口popen/pclose的用法 1.函数作用 函数定义如下 #include <stdio.h>FILE *popen(const char *command, const char *type); int pclose(FILE *stream);1.1 popen popen函数会创建一个管道&#xff0c;fork后调用shell来打开进程。由于管道的…

射频封装技术:层压基板和无源器件集成

射频和无线产品领域可以使用非常广泛的封装载体技术&#xff0c;它们包括引线框架、层压基板、低温共烧陶瓷&#xff08;LTCC&#xff09;和硅底板载体&#xff08;Si Backplane&#xff09;。由于不断增加的功能对集成度有了更高要求&#xff0c;市场对系统级封装方法&#xf…

Qt 项目Mingw编译器转换为VS编译器时的错误及解决办法

错误 在mingw生成的项目&#xff0c;转换为VS编译器时通常会报些以下错误&#xff08;C4819警告&#xff0c;C2001错误&#xff0c;C2143错误&#xff09; 原因及解决方式 这一般是由于字符编码引起的&#xff0c;在源代码文件中包含了中文字符导致的。Qt Creator 生成的代码文…

iptables防火墙和Firewalld

引言 在 Internet 中&#xff0c;企业通过各种应用系统来为用户提供各种服务&#xff0c;如 Web 网站、电子邮件系统、FTP 服务器、数据库系统等&#xff0c;那么&#xff0c;如何来保护这些服务器&#xff0c;过滤企业不需要的访问甚至是恶意的入侵呢&#xff0c;接下来&#…

【Linux】生产者消费者模型——环形队列RingQueue(信号量)

文章目录 铺垫信号量信号量概念信号量PV操作信号量基本接口 环形队列的生产消费模型引入环形队列访问环形队列代码实现代码改造多生产者多消费者代码 总结 铺垫 之前写的代码是存在不足的地方的&#xff1a; 我们使用线程操作临界资源的时候要先去判断临界资源是否满足条件&am…

最新动态 | 大势智慧参加广东省应急测绘保障与安全生产演练

4月20日&#xff0c;2023年度广东省应急测绘保障与安全生产演练在台山市赤溪镇鱼塘湾举行。本次演练由广东自然资源厅主办&#xff0c;广东省国土资源测绘院、江门市自然资源局和台山市人民政府承办。在省市各指导单位与参演单位的多方协同与指挥下&#xff0c;应急测绘保障与安…

【三十天精通Vue 3】第十四天 Vue 3 的单元测试详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录 引言一、为什么要进行单元测试1.1 单元测试的概念1.2 单元测试的优…

ctfshow_WEB_web2 wp

前言 写这个是因为。。。我想摆烂&#xff0c;就去从最简单的题开始做了&#xff0c;想着交一道题是一道嘛&#xff0c;总之觉得这样做很适合欺骗安慰自己&#xff08;逃 然后我发现我错了&#xff0c;我第二道题就做了好久还没做出来&#xff0c;甚至最后去点开了hint…… ps…

Java网络编程系列之NIO

Java网络编程系列之NIO 1.Java NIO概述1.1 阻塞IO1.2 非阻塞IO1.3 NIO概述1.3.1 Channels1.3.2 Buffer1.3.3 Selector 2.Java NIO(Channel)2.1Channel概述2.2 Channel实现2.3 FileChannel 介绍与示例2.4 FileChannel 操作详解2.4.1 打开FileChannel2.4.2 从FileChannel读取数据…

自定义测试平台搭建

体验地址&#xff1a;TestManagePlatform 首次加载会比较慢... 功能点 1.数据工具生成&#xff0c;增删改查 2.测试用例以及测试套件生成&#xff0c;测试执行测试基础用例增删改查。 3.Jacoco 代码增量扫描 4.文章管理 欢迎私聊&#xff0c;支撑自定义开发。

Java基础(十)字符串相关类

1 字符串相关类之不可变字符序列&#xff1a;String 1.1 String的特性 java.lang.String 类代表字符串。Java程序中所有的字符串文字&#xff08;例如"hello" &#xff09;都可以看作是实现此类的实例。 字符串是常量&#xff0c;用双引号引起来表示。它们的值在创…