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

news/2024/11/15 0:57:46/

作为一款流行的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.ppmy.cn/news/53453.html

相关文章

【libuv】入门:queue work 的跨线程异步通信

通过阅读2012年的uv book 入门。有中文版 Handles and Requests libuv works by the user expressing interest in particular events. This is usually done by creating a handle to an I/O device, timer or process. Handles are opaque structs named as uv_TYPE_t where…

推荐一些免费可用的热门 API

OCR 智能提取 通用文字识别OCR&#xff1a;多场景、多语种、高精度的整图文字检测和识别服务&#xff0c;多项指标行业领先&#xff0c;可识别中、英、日、韩、法、德多种语言。二维码识别OCR&#xff1a;对图片中的二维码、条形码进行检测和识别&#xff0c;返回存储的文字内…

Shenll编程之循环语句与函数

循环语句 一、for循环二、continue跳出循环continue二次跳出循环 三、break终止循环 循环是一种控制流程的结构&#xff0c;用于重复执行一段代码 遍历是一种数据操作的过程&#xff0c;用于访问并处理数据构成中的每个元素 在某些情况下&#xff0c;循环和遍历可以结合使用&am…

【脚本笔记】EditorApplication

EditorApplication 是编辑器下的主要程序类&#xff0c;为我们提供丰富的方法和事件等。 静态变量 applicationContentsPath 返回你当前Unity编辑器的Data文件路径。如D:/UnityVersions/2021.3.22f1c1/Editor/Data applicationPath 返回你当前Unity编辑器的执行文件位置。如…

使用buildroot编译完整系统【IMX6ULLPRO】

目录 构建 IMX6ULL Pro 版的根文件系统 编译系统 ​编辑 镜像文件 构建 IMX6ULL Pro 版的根文件系统 配置文件说明 编译系统 下面以 100ask_imx6ull_pro_ddr512m_systemV_qt5_defconfig 配置文 件为例&#xff0c;在 ubuntu 终端上说明 Buildroot 的配置过程&#x…

Jstat命令详解

jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”&#xff0c;主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控&#xff0c;包括了对Heap size和垃圾回收状况的监控。 下面展示常用命令 jstat –class<…

【Linux】7、一篇文章学习 Linux 中一些硬核的常用知识

目录 一、systemctl二、软链接三、日期&#xff08;date 命令&#xff09;四、Linux 的时区(1) 修改时区(2) ntp 五、IP 地址六、主机名七、域名解析八、配置 Linux 的固定 IP 地址(1) 在 VMwareWorkstation 中配置 IP 地址网关和网段&#xff08;IP 地址的范围&#xff09;(2)…

Postgres Create Objects (Database/User/Schema) and Privileges

1. 先研究一下 createdb C:\Users\Maxwell Pan>createdb --help createdb creates a PostgreSQL database.Usage:createdb [OPTION]... [DBNAME] [DESCRIPTION]Options:-D, --tablespaceTABLESPACE default tablespace for the database-e, --echo show…