spring boot集成websocket实现实时双向通信需建立持久化长连接,依赖spring-boot-starter-websocket与spring-boot-starter-web,可选sockjs和stomp;简单场景用websockethandler,广播场景用@enablewebsocketmessagebroker;需配置反向代理支持及调优缓冲区。

Spring Boot 集成 WebSocket 实现实时双向通信,核心在于建立持久化长连接,并通过标准协议完成服务端与客户端的自由收发。它不是轮询,也不依赖反复 HTTP 请求,而是一次握手后,双方随时可主动通信。
关键依赖要配齐
仅加 spring-boot-starter-websocket 不够,实际项目中建议同时引入:
-
spring-boot-starter-web(基础 Web 支持,必须) -
org.webjars:sockjs-client(兼容低版本浏览器,解决跨域和代理环境连接失败问题) -
org.webjars:stomp-websocket(如需使用 STOMP 协议做消息路由和订阅,推荐搭配@EnableWebSocketMessageBroker)
两种主流配置方式选一个
根据通信复杂度选择:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
简单直连场景(如设备上报、单点指令下发):用原生 WebSocketHandler。配置类实现
WebSocketConfigurer,注册自定义处理器(如YuMouDeviceWebSocketHandler),并设置跨域、缓冲区大小、会话超时等参数。 -
广播/订阅场景(如聊天室、行情推送):用 STOMP + 消息代理。启用
@EnableWebSocketMessageBroker,配置消息前缀(/app)、订阅路径(/topic或/user),前端通过 STOMP 客户端连接/ws端点,再订阅/topic/messages或发送至/app/chat。
前后端通信要对得上
后端定义好路径,前端必须严格匹配,常见对应关系:
- 后端注册端点:
registry.addEndpoint("/ws").withSockJS()→ 前端连接地址为http://host:port/ws(SockJS)或ws://host:port/ws(原生 WS) - STOMP 下,后端
@MessageMapping("/chat")对应前端stompClient.send("/app/chat", {}, JSON.stringify(msg)) - 后端
@SendTo("/topic/messages")对应前端stompClient.subscribe("/topic/messages", callback)
别漏掉生产环境细节
本地跑通不等于线上可用,这几个点容易出问题:
- 反向代理(Nginx/Traefik)需显式开启 WebSocket 支持,例如 Nginx 要加
proxy_http_version 1.1和proxy_set_header Upgrade $http_upgrade - 云厂商 SLB 或 WAF 可能默认关闭长连接,需确认其 WebSocket 超时策略是否大于服务端设置的
maxSessionIdleTimeout - 高并发下建议调大 Tomcat 的 WebSocket 缓冲区(
maxTextMessageBufferSize默认 64KB,设备上报二进制数据时可能不够)










