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

15. 实时数据-SpringBoot集成WebSocket

文章目录

  • 前言
    • 一、添加依赖(Maven)
    • 二、配置 WebSocket
      • 1. 创建 WebSocket 配置类
      • 2. 实现 WebSocket 处理器
    • 三、前端测试(HTML + JS)
    • 四、启动类(标准 Spring Boot 启动类)
    • 五、可选:使用 STOMP over WebSocket(更高级)
    • 六、注意事项

前言

SpringBoot集成WebSocket

在 Spring Boot 中集成 WebSocket 可以实现服务器与客户端之间的双向通信,常用于实时消息推送、聊天室、在线通知等场景。


一、添加依赖(Maven)

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

二、配置 WebSocket

1. 创建 WebSocket 配置类

importorg.springframework.context.annotation.Configuration;importorg.springframework.web.socket.config.annotation.EnableWebSocket;importorg.springframework.web.socket.config.annotation.WebSocketConfigurer;importorg.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;@Configuration@EnableWebSocketpublicclassWebSocketConfigimplementsWebSocketConfigurer{@OverridepublicvoidregisterWebSocketHandlers(WebSocketHandlerRegistryregistry){// 注册处理器,允许跨域访问registry.addHandler(myWebSocketHandler(),"/websocket").setAllowedOrigins("*");// 生产环境应限制具体域名}publicMyWebSocketHandlermyWebSocketHandler(){returnnewMyWebSocketHandler();}}

2. 实现 WebSocket 处理器

importorg.springframework.web.socket.CloseStatus;importorg.springframework.web.socket.TextMessage;importorg.springframework.web/socket.WebSocketSession;importorg.springframework.web.socket.handler.TextWebSocketHandler;importjava.util.concurrent.ConcurrentHashMap;publicclassMyWebSocketHandlerextendsTextWebSocketHandler{// 存储所有连接的会话privatestaticfinalConcurrentHashMap<String,WebSocketSession>sessions=newConcurrentHashMap<>();@OverridepublicvoidafterConnectionEstablished(WebSocketSessionsession)throwsException{sessions.put(session.getId(),session);System.out.println("新连接: "+session.getId());}@OverrideprotectedvoidhandleTextMessage(WebSocketSessionsession,TextMessagemessage)throwsException{Stringpayload=message.getPayload();System.out.println("收到消息: "+payload);// 广播给所有连接的客户端for(WebSocketSessions:sessions.values()){if(s.isOpen()){s.sendMessage(newTextMessage("Echo: "+payload));}}}@OverridepublicvoidafterConnectionClosed(WebSocketSessionsession,CloseStatusstatus)throwsException{sessions.remove(session.getId());System.out.println("连接关闭: "+session.getId());}@OverridepublicvoidhandleTransportError(WebSocketSessionsession,Throwableexception)throwsException{sessions.remove(session.getId());session.close(CloseStatus.SERVER_ERROR);System.out.println("连接异常: "+session.getId());}}

三、前端测试(HTML + JS)

<!DOCTYPEhtml><html><head><title>WebSocket 测试</title></head><body><inputtype="text"id="message"placeholder="输入消息"><buttononclick="sendMessage()">发送</button><divid="output"></div><script>constws=newWebSocket('ws://localhost:8080/websocket');ws.onopen=function(event){console.log('连接已建立');};ws.onmessage=function(event){document.getElementById('output').innerHTML+='<p>'+event.data+'</p>';};ws.onclose=function(event){console.log('连接已关闭');};functionsendMessage(){constmsg=document.getElementById('message').value;ws.send(msg);}</script></body></html>

四、启动类(标准 Spring Boot 启动类)

importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicclassWebsocketApplication{publicstaticvoidmain(String[]args){SpringApplication.run(WebsocketApplication.class,args);}}

五、可选:使用 STOMP over WebSocket(更高级)

如果你需要更复杂的协议(如订阅/发布、路径匹配、安全认证等),可以考虑使用STOMP协议,Spring Boot 对其有良好支持。


六、注意事项

  • setAllowedOrigins("*")在生产环境中应替换为具体的可信域名。
  • WebSocket 连接是长连接,注意资源释放和异常处理。
  • 若部署在 Nginx 或云服务后,需确保代理支持 WebSocket(设置 Upgrade 和 Connection 头)。

如需基于注解(@ServerEndpoint)的方式(使用原生 Java EE WebSocket API),也可以配合spring-boot-starter-websocket使用,但 Spring 推荐使用WebSocketHandler或 STOMP 方式。


本文的引用仅限自我学习如有侵权,请联系作者删除。
参考知识


http://www.zskr.cn/news/110994.html

相关文章:

  • LobeChat环境变量配置清单:每个参数都值得了解
  • 单元测试的10个最佳实践
  • C++ 构造函数完全指南
  • 锂金属电池锂枝晶沉积溶解过程的三维电化学变形模型研究
  • 接口测试的常见问题与解决方案
  • rh850 can uds刷写 boot +OTA 1. 基于can 通讯 的bootloader
  • 风光储燃料电池电解槽微电网仿真(并离网切换+一次调频/二次调频) 电解槽和燃料电池通过储氢罐相连
  • Windows下部署EmotiVoice语音合成全指南
  • 常见安全设备理解
  • LobeChat能否支持AR/VR交互?三维空间对话界面畅想
  • 国产大模型横评:从Kimi到Qwen,哪款最适合程序员?
  • EmotiVoice开源TTS项目结构与配置详解
  • 数据访问:MyBatisMybatis-Plus
  • 钢铁厂除氧供气 / 炉门驱动用工业级螺杆空压机​选型注意
  • 博客管理系统测试报告
  • 2025年安徽靠谱交通事故律师事务所排行榜,口碑好的交通事故 - mypinpai
  • 毅硕HPC | NVIDIA DGX Spark 万字硬核评测:将AI超级工厂带上桌面
  • 【隐语Secretflow】一文速通基于可信执行环境 (TEE) 的零信任计算系统
  • 一文搞懂AI大语言模型工作原理,初中生都能看懂
  • UVa 1396 Most Distant Point from the Sea
  • RuoYi v1.2.0 全端开发神器:让多端适配从未如此简单!
  • LobeChat能否申请基金?开源项目融资渠道
  • HunyuanVideo-Foley:高保真拟音生成扩散模型
  • VonaJS: Election
  • 少儿编程Scratch3.0教程——03 外观积木(基础知识)
  • 2025高温保护气氛箱式炉厂家TOP5权威推荐:超高温箱式炉 - 工业推荐榜
  • 电脑实用软件
  • GPU算力租赁推荐:低成本训练YOLO大模型
  • HunyuanVideo-Foley:AI自动生成同步音效全解析
  • 讯飞星火认知引擎如何通过LobeChat对外提供服务?