Spring 核心技术解析【纯干货版】- XVIII:Spring 网络模块 Spring-WebSocket 模块精讲

在现代 Web 开发中,实时通信已成为提升用户体验的关键技术之一。传统的 HTTP 轮询方式存在较高的延迟和带宽开销,而 WebSocket 作为一种全双工通信协议,能够在客户端和服务器之间建立持久连接,实现高效的双向数据传输。

Spring 框架在 WebSocket 方面提供了完善的支持,并通过 Spring-WebSocket 模块简化了 WebSocket 服务器的开发,使得开发者可以快速构建基于 WebSocket 的实时应用。

本文将深入解析 Spring-WebSocket 模块,并提供一个完整的 WebSocket 聊天服务器示例,帮助开发者快速掌握 Spring WebSocket 的核心技术。


文章目录

      • 1、Spring-WebSocket 模块介绍
        • 1.1、Spring-WebSocket 模块概述
        • 1.2、Spring-WebSocket 模块依赖
        • 1.3、Spring-WebSocket 模块作用
      • 2、Spring WebSocket 案例:一个简单的 WebSocket 聊天服务器
        • 2.1、添加 Maven 依赖
        • 2.2、创建 WebSocket 处理器
        • 2.3、配置 WebSocket 服务器
        • 2.4、创建 Web 应用初始化类
        • 2.5、创建 WebSocket 客户端(HTML+JavaScript)
        • 2.6、运行 WebSocket 服务器
        • 2.7、运行效果
      • X、后记


1、Spring-WebSocket 模块介绍

1.1、Spring-WebSocket 模块概述

Spring WebSocket 模块,是 Spring 框架中用于支持 WebSocket 协议的部分,WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,使得客户端和服务器可以进行实时交互,常用于即时通讯、在线游戏、股票报价等场景。

1.2、Spring-WebSocket 模块依赖

Spring-Web 模块的依赖有两个,分别是 Spring-Context 模块和 Spring-Core 模块和 Spring-Web 模块。

其中 Spring Beans 模块是对 Spring Bean 进行定义,实现 IOC 基础功能的模块。而 Spring-Core 是 Spring 中的基础模块,它提供了框架运行所必需的核心功能。

1.3、Spring-WebSocket 模块作用

Spring-WebSocket 模块作用:

  • 负责提供 WebSocket 协议的支持,实现双向、实时的消息通信。
  • 适用于需要低延迟通信的应用,如在线聊天、股票行情推送、协作编辑等。
  • 允许基于 WebSocket 进行长连接通信,相比传统 HTTP 轮询方式更高效。
  • 可结合 STOMP 协议,实现基于消息队列的 WebSocket 交互,增强可扩展性。

2、Spring WebSocket 案例:一个简单的 WebSocket 聊天服务器

下面是一个基于 Spring-WebSocke t的 WebSocket 服务器示例。我们将手动配置 WebSocket,并使用 Spring WebSocket + Tomcat(或其他 Servlet 容器) 实现一个简单的 WebSocket 聊天服务器。

功能:搭建 WebSocket 服务器,支持多个客户端连接。客户端可以向服务器发送消息,服务器会广播该消息给所有连接的客户端。

2.1、添加 Maven 依赖
<dependencies><!-- Spring WebSocket --><dependency><groupId>org.springframework</groupId><artifactId>spring-websocket</artifactId><version>6.1.3</version></dependency><!-- Spring Web --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>6.1.3</version></dependency><!-- Java WebSocket API --><dependency><groupId>javax.websocket</groupId><artifactId>javax.websocket-api</artifactId><version>1.1</version></dependency><!-- Tomcat WebSocket 实现 --><dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-websocket</artifactId><version>10.1.17</version></dependency>
</dependencies>
2.2、创建 WebSocket 处理器

我们需要实现 TextWebSocketHandler 来处理 WebSocket 消息。

import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;public class ChatWebSocketHandler extends TextWebSocketHandler {private static final Set<WebSocketSession> sessions = Collections.synchronizedSet(new HashSet<>());@Overridepublic void afterConnectionEstablished(WebSocketSession session) {sessions.add(session);System.out.println("新用户连接: " + session.getId());}@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {System.out.println("收到消息: " + message.getPayload());// 广播消息给所有连接的客户端for (WebSocketSession webSocketSession : sessions) {if (webSocketSession.isOpen()) {webSocketSession.sendMessage(new TextMessage("用户 " + session.getId() + " 说: " + message.getPayload()));}}}@Overridepublic void afterConnectionClosed(WebSocketSession session, org.springframework.web.socket.CloseStatus status) {sessions.remove(session);System.out.println("用户断开: " + session.getId());}
}
2.3、配置 WebSocket 服务器

创建 WebSocket 配置类,注册 WebSocket 处理器。

import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(new ChatWebSocketHandler(), "/chat").setAllowedOrigins("*");}
}
2.4、创建 Web 应用初始化类

由于不使用 Spring Boot,我们需要手动初始化 DispatcherServletWebSocket 配置。

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;public class WebAppInitializer implements WebApplicationInitializer {@Overridepublic void onStartup(ServletContext servletContext) throws ServletException {// 创建 Spring 上下文AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();context.register(WebSocketConfig.class);// 创建 DispatcherServletServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(context));dispatcher.setLoadOnStartup(1);dispatcher.addMapping("/");}
}
2.5、创建 WebSocket 客户端(HTML+JavaScript)

客户端使用 HTML+JavaScript 连接 WebSocket 服务器,并发送/接收消息。

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WebSocket 聊天</title>
</head>
<body><h2>WebSocket 聊天</h2><input type="text" id="message" placeholder="输入消息"><button onclick="sendMessage()">发送</button><ul id="messages"></ul><script>const socket = new WebSocket("ws://localhost:8080/chat");socket.onopen = () => console.log("已连接 WebSocket 服务器");socket.onmessage = (event) => {const li = document.createElement("li");li.textContent = event.data;document.getElementById("messages").appendChild(li);};function sendMessage() {const message = document.getElementById("message").value;socket.send(message);}</script>
</body>
</html>
2.6、运行 WebSocket 服务器

部署到 Tomcat将代码打包成 .war 部署到 Tomcat webapps 目录下。启动 Tomcat,访问 http://localhost:8080/chat.html 进行测试。

使用 Jetty 运行:在 WebAppInitializer 中修改配置,改用 Jetty 服务器。

2.7、运行效果

访问 http://localhost:8080/chat.html,打开多个浏览器窗口。在其中一个窗口输入消息并发送,所有连接的客户端都会收到广播消息。


X、后记

通过本篇文章,我们深入探讨了 Spring-WebSocket 模块的基本概念、依赖配置、核心作用,并基于实际案例实现了一个简单的 WebSocket 聊天服务器。

WebSocket 技术在即时通讯、协作应用、金融数据推送等领域有着广泛的应用。掌握 Spring-WebSocket 后,开发者可以轻松构建高效的实时通信应用,并结合 STOMP、Spring Security 等技术,实现更复杂的 WebSocket 交互。

希望本文能帮助你更好地理解 WebSocket 在 Spring 生态中的应用,为构建高效的实时系统打下坚实的基础。

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

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

相关文章

VirtualBox安装FnOS

1.下载FnOS镜像 下载网址&#xff1a; https://www.fnnas.com/2.创建虚拟机 虚拟机配置如图所示&#xff08;注意操作系统类型和网卡配置&#xff09; &#xff08;注意启动顺序&#xff09; 3.启动虚拟机 网卡类型选择桥接的Virtual Adapter 如果没有IP地址或者IP地址无法…

java根据集合中对象的属性值大小生成排名

1&#xff1a;根据对象属性降序排列 public static <T extends Comparable<? super T>> LinkedHashMap<T, Integer> calculateRanking(List<ProductPerformanceInfoVO> dataList, Function<ProductPerformanceInfoVO, T> keyExtractor) {Linked…

grep命令: 过滤

[rootxxx ~]# grep root /etc/passwd [rootxxx ~]# grep -A 2 root /etc/passwd -A #匹配行后两行 [rootxxx ~]# grep -B 2 root /etc/passwd -B #匹配行前两行 [rootxxx ~]# grep -C 2 root /etc/passwd -C #前后2行 [rootxxx ~]# grep -n root /…

二十种中药果实识别分类系统,Python/resnet18/pytorch

二十种中药果实识别分类系统,Python/resnet18/pytorch 基于pytorch训练, resnet18网络&#xff0c;可用于训练其他分类问题&#xff0c;也可自己重新训练 20类中药材具体包括&#xff1a;(1) 补骨脂&#xff0c;(2) 草豆蔻&#xff0c;(3) 川楝子&#xff0c;(4) 地肤子&…

SpringBoot启动run方法分析

SpringBoot启动run方法分析 1.场景引入 在项目启动的时候&#xff0c;有时候我们需要在启动的时候&#xff0c;执行一些逻辑。 比如说&#xff0c;项目启动的时候&#xff0c;我想把一些热门商品的数据加载到缓存中去&#xff1b; 比如说&#xff0c;自定义了一个netty服务…

Linux信号——信号的处理(3)

信号是什么时候被处理&#xff1f; 进程从内核态&#xff0c;切换到用户态的时候&#xff0c;信号会被检测处理。 内核态&#xff1a;操作系统的状态&#xff0c;权限级别高 用户态&#xff1a;你自己的状态 内核态和用户态 进程地址空间第三次 所谓的系统调用本质其实是一堆…

MySQL篇(四)事务相关知识详解

MySQL篇(四&#xff09;事务相关知识详解 MySQL篇(四&#xff09;事务相关知识详解一、事务的特性&#xff08;ACID&#xff09;原子性&#xff08;Atomicity&#xff09;一致性&#xff08;Consistency&#xff09;隔离性&#xff08;Isolation&#xff09;持久性&#xff08;…

SpringBoot定时任务深度优化指南

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 SpringBoot定时任务深度优化指南 引言 在分布式系统架构中&#xff0c;定时任务是实现业务逻辑自动化的重要组件。SpringBoot通过Scheduled注解提供了便捷的…

MySQL表结构导出(Excel)

目录 一、java实现MySQL表结构导出&#xff08;Excel&#xff09; 二、python实现MySQL表结构导出&#xff08;Excel&#xff09; 又到了写毕设的时候了&#xff0c;计算机专业在写论文第四章系统设计的时候肯定会遇到和我一样的难题——要在论文中将数据库的表结构以表格形式…

Android使用OpenGL和MediaCodec渲染视频

目录 一&#xff0c;借助MediaCodec封装解码工具类VideoCodec 二&#xff0c;使用OpenGl绘制视频封装SoulFilter 一&#xff0c;借助MediaCodec封装解码工具类VideoCodec /*** 解码工具类* 解码完成后的数据 通过 ISurface 回调出去*/ public class VideoCodec {private ISu…

day39——输入操作:多值输入

数组输入&#xff1a; int main() {//***** 1、多值输入&#xff08;C&#xff09;/*输入&#xff1a;3 --> 3个值5 4 9*/int n;cin >> n; //输入个数const int MAX_SIZE 0xFFFF;//限定最大个数int a[MAX_SIZE];for (int i 0; i < n; i) {//用 n 作控制输入…

第九课:LoRA模型的原理及应用

文章目录 Part.01 3种LoRA的使用方式Part.02 5种LoRA的应用方向Part.01 3种LoRA的使用方式 LoRA能够在家用级设备上训练,实现对Checkpoint在某些方面的微调使用Lora的三种方式:放置Lora模型到目录中,然后作为提示词的一部分输入。点击生成按钮下面的“画”,然后打开Additio…

Cortex-M3 NVIC可以控制异常向量表的哪些部分

Cortex-M3 的 NVIC(嵌套向量中断控制器)不直接控制整个异常向量表,但可以管理向量表中与中断相关的部分行为。以下是 NVIC 对异常向量表的具体控制范围和相关机制: 1. NVIC 直接控制的部分 NVIC 主要管理 外部中断(IRQ) 和部分 系统异常 的行为,但对向量表本身的存储位…

双向链表增删改查的模拟实现

本章目标 0.双向链表的基本结构 1.双向链表的初始化 2.头插尾插 3.头删尾删 4.查找与打印 5.在指定位置之前插入数据/在指定位置之后插入数据 6.在指定位置之前删除数据/在指定位置之后删除数据 7.销毁链表 0.双向链表的基本结构 本章所实现的双向链表是双向循环带头链表,是…

实战交易策略 篇十四:江南神鹰捕捉热点和熊市生存交易策略

文章目录 系列文章捕捉热点是股市最大的掘金术市场温度不低于50是热点产生的必要条件题材的大小和新颖程度决定热点的持续时间和涨幅炒作热点的3个阶段捕捉热点的方法与步骤操作实战案例熊市生存术“熊市最好的做法是离开股市”的说法是一句空话熊市盈利模式:不轻言底部,超跌…

Linux错误(6)X64向量指令访问地址未对齐引起SIGSEGV

Linux错误(6)X64向量指令访问地址未对齐引起SIGSEGV Author: Once Day Date: 2025年4月4日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: Linux实…

解码 __iter__ 和 itertools.islice - 迭代的艺术

文章目录 前言一、`_iter__`:自定义迭代的钥匙1.1 什么是 __iter__?1.2 基本用法1.3 高级用法:独立迭代器二、itertools.islice:迭代切片的利器2.1 什么是 itertools.islice?2.2 基本用法2.3 处理无限序列2.4 实际应用三、`__iter__` 与 `islice` 的结合六、为什么需要它们…

使用VSCode编写C#程序

目录 一、环境搭建&#xff1a;构建高效开发基础1. 安装VSCode2. 配置.NET SDK3. 安装核心扩展 二、项目开发全流程1. 创建项目2. 代码编辑技巧3. 调试配置4. 高级调试技巧5. 编译与运行 三、常见问题解决指南1. 项目加载失败2. IntelliSense失效3. 代码格式化4. 典型编译错误&…

日本汽车规模性经济计划失败,日产三大品牌的合并合作共赢,还是绝地求生?本田与日产合并确认失败,将成为世界第三大汽车集团愿景失败

本田与日产(含三菱汽车)的合并计划最终因核心矛盾无法调和而宣告失败,这一事件揭示了传统车企在行业变革期的深层困境。以下从合并动机、失败原因、本质判断及未来影响等方面综合分析: 一、合并的初衷:生存压力主导的被动策略 市场危机与财务困境 中国市场溃败:日系品牌在…

AutoCAD2026中文版下载安装教程

AutoCAD是一款由Autodesk公司开发的计算机辅助设计软件&#xff0c;被广泛应用于建筑设计、机械设计、电气设计、土木工程、装饰装潢等多个领域。AutoCAD2026中文版在原有的基础上进行了多项改进和优化&#xff0c;为用户提供了更为高效、便捷的绘图和设计体验。这里我给大家分…