当前位置: 首页 > article >正文

WebSocket集成方案对比

WebSocket集成方案对比与实战

架构选型全景图

JavaEE标准
Spring生态
响应式编程
轻量级库
多协议支持
高性能NIO
WebSocket实现方案
技术栈
Javax API
Spring WebMVC
Spring WebFlux
Java-WebSocket
Socket.IO
Netty

一、Javax原生WebSocket API

核心实现代码

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;@ServerEndpoint("/ws/javax")
public class JavaxWebSocketEndpoint {private static final Set<Session> sessions = new CopyOnWriteArraySet<>();@OnOpenpublic void onOpen(Session session) {sessions.add(session);System.out.println("New connection: " + session.getId());}@OnMessagepublic void onMessage(String message, Session sender) {sessions.parallelStream().filter(Session::isOpen).forEach(session -> {try {session.getBasicRemote().sendText("Echo: " + message);} catch (IOException e) {e.printStackTrace();}});}@OnClosepublic void onClose(Session session) {sessions.remove(session);System.out.println("Connection closed: " + session.getId());}
}

技术特点
✅ 原生JavaEE标准支持(JSR-356)
✅ 无需额外依赖
⚠️ 需手动处理线程安全
⚠️ 不支持协议自动升级

二、Spring WebMVC集成方案

Maven依赖

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

配置与实现

@Configuration
@EnableWebSocket
public class WebMvcWebSocketConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(webSocketHandler(), "/ws/spring").addInterceptors(new HttpSessionHandshakeInterceptor()).setAllowedOrigins("*");}@Beanpublic WebSocketHandler webSocketHandler() {return new TextWebSocketHandler() {private final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();@Overridepublic void afterConnectionEstablished(WebSocketSession session) {sessions.add(session);}@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) {sessions.forEach(s -> {try {s.sendMessage(new TextMessage("Processed: " + message.getPayload()));} catch (IOException e) {// 异常处理}});}};}
}

进阶特性

  • 消息转换器(JSON/Protobuf)
  • STOMP子协议支持
  • 与Spring Security集成

三、Spring WebFlux响应式方案

响应式端点

@Configuration
@Slf4j
public class BusinessWebSocketConfig {// 自定义业务处理器@Componentpublic static class BusinessProcessor {private final ReactiveRedisTemplate<String, String> redisTemplate;public BusinessProcessor(ReactiveRedisTemplate<String, String> redisTemplate) {this.redisTemplate = redisTemplate;}// 示例业务处理:消息校验+存储Redis+生成响应public Mono<String> processMessage(WebSocketMessage message) {String payload = message.getPayloadAsText();return Mono.just(payload).filter(msg -> !msg.isBlank())        // 空消息过滤.switchIfEmpty(Mono.error(new IllegalArgumentException("空消息"))).flatMap(msg -> redisTemplate.opsForList().leftPush("ws:message:queue", msg)  // 存储到Redis队列.thenReturn("ACK: " + msg)    // 生成响应消息).timeout(Duration.ofSeconds(2))       // 超时控制.onErrorResume(ex -> {log.error("处理失败: {}", ex.getMessage());return Mono.just("ERROR: " + ex.getMessage());});}}@Beanpublic HandlerMapping handlerMapping(BusinessProcessor processor) {Map<String, WebSocketHandler> handlers = new HashMap<>();handlers.put("/ws/business", session -> {// 输入流背压配置Flux<WebSocketMessage> inputStream = session.receive().onBackpressureBuffer(2000, BufferOverflowStrategy.DROP_OLDEST).doOnNext(msg -> Metrics.counter("websocket.receive.count").increment()).publishOn(Schedulers.boundedElastic());  // 切换到弹性线程池// 业务处理管道return session.send(inputStream.delayElements(Duration.ofMillis(50)) // 流速控制.concatMap(processor::processMessage) // 业务处理(保证顺序).map(resp -> session.textMessage(resp)).doOnError(ex -> log.error("发送异常", ex)).retryWhen(Retry.backoff(3, Duration.ofSeconds(1))));});return new SimpleUrlHandlerMapping(handlers, -1);}}
Client WebSocketSession BusinessProcessor Redis 发送消息 消息入队(背压缓冲) 空消息过滤 存储消息到队列 返回存储结果 生成响应消息 返回处理结果 返回错误信息 alt [处理异常] Client WebSocketSession BusinessProcessor Redis

选择策略建议

  • 实时聊天系统‌:采用DROP_OLDEST策略+500ms延迟均衡体验
  • 金融交易系统‌:使用ERROR策略+重试队列保证数据完整性
  • 物联网数据采集‌:结合publishOn与delayElements实现阶梯式降速

四、Java-WebSocket独立库

服务端实现

import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;public class JavaWebSocketServer extends WebSocketServer {public JavaWebSocketServer(int port) {super(new InetSocketAddress(port));}@Overridepublic void onOpen(WebSocket conn, ClientHandshake handshake) {System.out.println("New client: " + conn.getRemoteSocketAddress());}@Overridepublic void onMessage(WebSocket conn, String message) {broadcast("Broadcast: " + message);}public static void main(String[] args) {new JavaWebSocketServer(9001).run();}
}

客户端连接

const ws = new WebSocket('ws://localhost:9001');
ws.onmessage = (event) => console.log('Received:', event.data);

五、Socket.IO集成方案

服务端配置(基于Netty)

@Configuration
public class SocketIOConfig {@Beanpublic SocketIOServer socketIOServer() {Configuration config = new Configuration();config.setHostname("localhost");config.setPort(9092);SocketIOServer server = new SocketIOServer(config);server.addConnectListener(client -> {client.sendEvent("welcome", "Connected to Socket.IO");});server.addEventListener("chat", String.class, (client, data, ack) -> server.getBroadcastOperations().sendEvent("message", data));return server;}
}

客户端适配

import { io } from "socket.io-client";const socket = io("http://localhost:9092");
socket.on("welcome", data => console.log(data));
socket.emit("chat", "Hello Socket.IO");

六、Netty原生实现

完整服务端代码

public class NettyWebSocketServer {public static void main(String[] args) throws InterruptedException {EventLoopGroup bossGroup = new NioEventLoopGroup(1);EventLoopGroup workerGroup = new NioEventLoopGroup();try {new ServerBootstrap().group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast(new HttpServerCodec());pipeline.addLast(new ChunkedWriteHandler());pipeline.addLast(new HttpObjectAggregator(8192));pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));pipeline.addLast(new TextWebSocketFrameHandler());}}).bind(8080).sync().channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}private static class TextWebSocketFrameHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) {ctx.writeAndFlush(new TextWebSocketFrame("NETTY: " + msg.text()));}}
}

技术方案对比矩阵

特性JavaxWebMVCWebFluxJava-WebSocketSocket.IONetty
协议支持WSWS/STOMPRSocketWSWS+Polling自定义
最大连接数1万5万10万+3万5万100万+
内存消耗极低
学习曲线简单中等较高简单中等陡峭
集群支持需扩展需扩展原生支持需扩展需扩展需扩展
生产就绪度☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

最佳实践指南

  • 中小型项目‌:优先选择Spring WebMVC方案
  • 高并发场景‌:WebFlux或Netty方案
  • 多协议需求‌:Socket.IO支持降级通信
  • 资源受限环境‌:Java-WebSocket轻量级方案
  • 需要精细控制‌:直接使用Netty底层API

通过本文您可以快速掌握不同场景下的WebSocket技术选型,建议结合实际业务需求进行性能测试后确定最终方案。

相关文章:

WebSocket集成方案对比

​ WebSocket集成方案对比与实战 架构选型全景图 #mermaid-svg-BEuyOkkoP6cFygI0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BEuyOkkoP6cFygI0 .error-icon{fill:#552222;}#mermaid-svg-BEuyOkkoP6cFygI0 .er…...

深入理解 Istio v1.25.2

要深入理解 Istio 的最新版本&#xff08;截至 2025 年 5 月&#xff0c;最新版本为 1.25.2&#xff0c;发布Iweb:1⁊&#xff09;源码&#xff0c;我们可以通过分析其核心组件和代码结构来加深对 Istio 的理解。以下是对 Istio 源码的解读&#xff0c;结合其架构和功能&#x…...

使用conda导致无法找到libpython动态库

最近在用 AFL 的时候编译完成后遇到如下的报错&#xff1a; afl-fuzz: error while loading shared libraries: libpython3.9.so.1.0: cannot open shared object file: No such file or directory然后发现是因为编译时用的Python环境是通过miniconda构建的虚拟环境&#xff0…...

Redis+Caffeine构建高性能二级缓存

大家好&#xff0c;我是摘星。今天为大家带来的是RedisCaffeine构建高性能二级缓存&#xff0c;废话不多说直接开始~ 目录 二级缓存架构的技术背景 1. 基础缓存架构 2. 架构演进动因 3. 二级缓存解决方案 为什么选择本地缓存&#xff1f; 1. 极速访问 2. 减少网络IO 3…...

MyBatis-Plus使用 wrapper.apply() 添加自定义 SQL 片段

在 MyBatis-Plus 中&#xff0c;wrapper.apply() 方法允许你在构建查询条件时插入任意的 SQL 片段。这对于实现一些复杂的查询需求特别有用&#xff0c;比如添加子查询、使用数据库特定函数等&#xff1b; 示例 1: 基本应用 import com.baomidou.mybatisplus.core.conditions…...

【计算机网络】NAT技术、内网穿透与代理服务器全解析:原理、应用及实践

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 上篇文章&#xff1a;以太网、MAC地址、MTU与ARP协议 下篇文章&#xff1a;五种IO模型与阻…...

Python训练打卡Day21

常见的降维算法&#xff1a; # 先运行预处理阶段的代码 import pandas as pd import pandas as pd #用于数据处理和分析&#xff0c;可处理表格数据。 import numpy as np #用于数值计算&#xff0c;提供了高效的数组操作。 import matplotlib.pyplot as plt #用于绘…...

【大模型MCP协议】MCP官方文档(Model Context Protocol)一、开始——1. 介绍

https://modelcontextprotocol.io/tutorials/building-mcp-with-llms 文章目录 介绍为什么选择MCP&#xff1f;总体架构 开始使用快速入门示例 教程探索MCP贡献支持和反馈探索 MCP贡献代码支持与反馈 介绍 开始使用模型上下文协议&#xff08;MCP&#xff09; C# SDK已发布&…...

三大告警方案解析:从日志监控到流处理的演进之路

引言&#xff1a;告警系统的核心挑战与演进逻辑 在分布式系统中&#xff0c;实时告警是实现业务稳定性的第一道防线。随着系统复杂度提升&#xff0c;告警机制从简单的日志匹配逐步演进到流式处理的秒级响应。本文将基于‌三大主流方案‌&#xff08;日志告警、离线统计、实时流…...

node .js 启动基于express框架的后端服务报错解决

问题&#xff1a; node .js 用npm start 启动基于express框架的后端服务报错如下&#xff1a; /c/Program Files/nodejs/npm: line 65: 26880 Segmentation fault "$NODE_EXE" "$NPM_CLI_JS" "$" 原因分析&#xff1a; 遇到 /c/Program F…...

互联网大厂Java求职面试实战:Spring Boot与微服务场景深度解析

&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通 &#x1f601; 2. 毕业设计专栏&#xff0c;毕业季咱们不慌忙&#xff0c;几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…...

并发笔记-信号量(四)

文章目录 背景与动机31.1 信号量&#xff1a;定义 (Semaphores: A Definition)31.2 二元信号量 (用作锁) (Binary Semaphores - Locks)31.3 用于排序的信号量 (Semaphores For Ordering)31.4 生产者/消费者问题 (The Producer/Consumer (Bounded Buffer) Problem)31.5 读写锁 (…...

【HTOP 使用指南】:如何理解主从线程?(以 Faster-LIO 为例)

htop 是 Linux 下常用的进程监控工具&#xff0c;它比传统的 top 更友好、更直观&#xff0c;尤其在分析多线程或多进程程序时非常有用。 以下截图就是在运行 Faster-LIO 实时建图时的 htop 状态展示&#xff1a; &#x1f50d; 一、颜色说明 白色&#xff08;或亮色&#xf…...

数据同步DataX任务在线演示

数据同步DataX任务在线演示 1. 登录系统 访问系统登录页面&#xff0c;输入账号密码完成身份验证。 2. 环境准备 下载datax安装包&#xff0c;并解压到安装目录 3. 集群创建 点击控制台-多集群管理 计算组件添加DataX 配置DataX引擎,Datax.local.path填写安装目录。 4. …...

The Graph:区块链数据索引的技术架构与创新实践

作为Web3生态的核心基础设施&#xff0c;The Graph通过去中心化索引协议重塑了链上数据访问的范式。其技术设计不仅解决了传统区块链数据查询的效率瓶颈&#xff0c;还通过经济模型与多链兼容性构建了一个开放的开发者生态。本文从技术角度解析其架构、机制及创新实践。 一、技…...

telnetlib源码深入解析

telnetlib 是 Python 标准库中实现 Telnet 客户端协议的模块&#xff0c;其核心是 Telnet 类。以下从 协议实现、核心代码逻辑 和 关键设计思想 三个维度深入解析其源码。 一、Telnet 协议基础 Telnet 协议基于 明文传输&#xff0c;通过 IAC&#xff08;Interpret As Command…...

【AI提示词】波特五力模型专家

提示说明 具备深入对企业竞争环境分析能力的专业人士。 提示词 # Role:波特五力模型专家## Profile - language:中文 - description:具备深入对企业竞争环境分析能力的专业人士 - background:熟悉经济学基础理论&#xff0c;擅长用五力模型分析行业竞争 - personality…...

爬虫逆向加密技术详解之对称加密算法:SM4加密解密

文章目录 一、对称加密介绍二、SM4算法简介三、SM4加密解密原理四、快速识别SM4加密的方法4.1 密文长度判断4.2 验证密文字符集4.3 代码特征识别 五、代码实现5.1 JavaScript实现SM4加密解密5.2 Python实现SM4加密解密 一、对称加密介绍 SM4属于对称加密算法&#xff0c;不知道…...

React 播客专栏 Vol.9|React + TypeScript 项目该怎么起步?从 CRA 到配置全流程

&#x1f44b; 欢迎回到《前端达人 React 播客书单》第 9 期&#xff08;正文内容为学习笔记摘要&#xff0c;音频内容是详细的解读&#xff0c;方便你理解&#xff09;&#xff0c;请点击下方收听 你是不是常在网上看到 .tsx 项目、Babel、Webpack、tsconfig、Vite、CRA、ESL…...

Android 数据持久化之 文件存储

在 Android 开发中,存储文件是一个常见的需求。文件存储对数据不进行任何格式化处理,原封不动地保存到文件中。适合存储一些简单的文本数据或者二进制数据。 一、存储路径 根据文件的存储位置和访问权限,可以将文件存储分为内部存储(Internal Storage)和外部存储(Exter…...

TAPIP3D:持久3D几何中跟踪任意点

简述 在视频中跟踪一个点&#xff08;比如一个物体的某个特定位置&#xff09;听起来简单&#xff0c;但实际上很复杂&#xff0c;尤其是在3D空间中。传统方法通常在2D图像上跟踪像素&#xff0c;但这忽略了物体的3D几何信息和摄像机的运动&#xff0c;导致跟踪不稳定&#xf…...

数据分析预备篇---NumPy数组

NumPy是数据分析时常用的库,全称为Numerical Python,是很多数据或科学相关Python包的基础,包括pandas,scipy等等,常常被用于科学及工程领域。NumPy最核心的数据结构是ND array,意思是N维数组。 #以下是一个普通列表的操作示例:arr = [5,17,3,26,31]#打印第一个元素 prin…...

uniapp 生成海报二维码 (微信小程序)

先下载qrcodenpm install qrcode 调用 community_poster.vue <template><view class"poster-page"><uv-navbar title"物业推广码" placeholder autoBack></uv-navbar><view class"community-info"><text clas…...

16.Excel:数据收集

一 使用在线协作工具 简道云。 excel的在线表格协作在国内无法使用&#xff0c;而数据采集最需要在线协作。 二 使用 excel 1.制作表格 在使用excel进行数据采集的时候&#xff0c;会制作表头给填写人&#xff0c;最好还制作一个示例。 1.输入提示 当点击某个单元格的时候&am…...

AI系列:智能音箱技术简析

AI系列&#xff1a;智能音箱技术简析 智能音箱工作原理详解&#xff1a;从唤醒到执行的AIPipeline-CSDN博客 挑战真实场景对话——小爱同学背后关键技术深度解析 - 知乎 (zhihu.com) AI音箱的原理&#xff0c;小爱同学、天猫精灵、siri。_小爱同学原理-CSDN博客 智能音箱执行步…...

【网络安全】——大端序(Big-Endian)​​和​​小端序(Little-Endian)

字节序&#xff08;Endianness&#xff09;是计算机系统中多字节数据&#xff08;如整数、浮点数&#xff09;在内存中存储或传输时&#xff0c;​​字节排列顺序​​的规则。它分为两种类型&#xff1a;​​大端序&#xff08;Big-Endian&#xff09;​​和​​小端序&#xf…...

如何通过服务主体获取 Azure 凭据

本文详细讲解如何通过 Azure 服务主体生成凭据,使应用程序能够安全访问 Azure 资源(如部署 Container Apps)。以下步骤基于 Azure Portal 操作,适用于自动化部署、CI/CD 等场景。 步骤 1:登录 Azure Portal 访问 Azure 门户。使用 Azure 账户(需具备订阅管理员权限)登录…...

BUUCTF——Ezpop

BUUCTF——Ezpop 进入靶场 给了php代码 <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack It! class Modifier {protected $v…...

三、Hadoop1.X及其组件的深度剖析

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月7日 专栏&#xff1a;Hadoop教程 一、Hadoop 1.X 概述 &#xff08;一&#xff09;概念 Hadoop 是 Apache 开发的分布式系统基础架构&#xff0c;用 Java 编写&#xff0c;为集群处理大型数据集提供编程模型&#xff0c;…...

MySQL(5)如何创建数据库和表?

在 MySQL 中创建数据库和表是进行数据存储和管理的基础操作。以下是详细的步骤和示例代码&#xff0c;涵盖从连接 MySQL、创建数据库、创建表到插入数据的全过程。 步骤一&#xff1a;连接 MySQL 服务器 首先&#xff0c;我们需要连接到 MySQL 服务器&#xff0c;可以使用命令…...