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

SpringBoot集成WebSocket

1)添加websocket的依赖

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

2)添加websocket相关的配置

@Configuration
public class WebsoketConfig {/*** 这个Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint*/@Beanpublic ServerEndpointExporter serverEndpointExporter(){return new ServerEndpointExporter();}/*** 为了能在这个类中获取到Spring的ApplicationContext,需要把它让Spring来管理* */@Beanpublic CustomSpringConfigurator customSpringConfigurator() {return new CustomSpringConfigurator();}
}

3)添加websocket的业务处理类

/*** websocket服务端处理程序* configurator属性可以从Spring容器中去获取Endpoint对象实例* */
@Slf4j
@Component
@ServerEndpoint(value = "/ws/{clientId}", configurator = CustomSpringConfigurator.class)
public class WebsocketServer {/*** 保存clientId和session的对应关系* */private Map<String, Session> sessionMap = new ConcurrentHashMap<>();@OnOpenpublic void onOpen(Session session, @PathParam("clientId")String clientId){log.info("客户端:{}建立连接", clientId);sessionMap.put(clientId, session);}@OnMessagepublic void onMessage(String msg, @PathParam("clientId")String clientId){log.info("收到客户端:{}的消息:{}", msg, clientId);}@OnClosepublic void onClose(@PathParam("clientId")String clientId){log.info("客户端:{}断开连接", clientId);sessionMap.remove(clientId);}/*** 主动向client推送消息* */public void sendToClient(String clientId, String message) throws Exception{Session session = sessionMap.get(clientId);if(session == null){log.error("客户端:{}不在线", clientId);}else{session.getBasicRemote().sendText(message);}}
}

注意这里的configurator属性设置的CustomSpringConfigurator,这个configurator的作用是让tomcat从SpringIOC容器中去获取Endpoint的实例,否则的话,就会出现SpringIOC中有一个Endpoint实例,tomcat还会自己去new一个Endpoint实例,此时在OnOpen、OnMessage、OnClose中无法使用SpringIOC注入属性成员。

public class CustomSpringConfigurator extends ServerEndpointConfig.Configurator implements ApplicationContextAware {/*** Spring application context.*/private static volatile ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {CustomSpringConfigurator.applicationContext = applicationContext;}/*** Endpoint的实例从Spring的IOC容器去获取,否则tomcat会自己new一个WebsocketServer的实例出来* */@Overridepublic <T> T getEndpointInstance(Class<T> clazz) throws InstantiationException {return applicationContext.getBean(clazz);}
}

完整的源码下载:https://github.com/xjs1919/enumdemo下面的websocket-demo。
参考文档

相关文章:

  • 软件项目管理---胡乱复习版
  • 虚幻学习笔记10—C++函数与蓝图的通信
  • C++STL的vector模拟实现
  • 现代皮质沙发模型材质编辑
  • React中父子之间数据的通信方式
  • 托盘四向穿梭车自动化密集库供应|单机智能向系统智能跨越的HEGERLS托盘四向车系统
  • c# bitmap压缩导致png不透明的问题解决
  • 关于mars3d通过zIndex参数实现控制图层层级叠加效果说明
  • 【go-zero】go-zero使用ent框架 如何使用源生sql完成查询
  • YOLOv8算法改进【NO.86】将主干特征网络替换为2023年顶会CVPR的EfficientViT,助力SCI论文发表
  • Kotlin关键字二——constructor和init
  • 算法通关村第十三关—数学与数学基础问题(青铜)
  • ekho环境Linux通过Docker安装
  • AI 训练框架:Pytorch TensorFLow MXNet Caffe ONNX PaddlePaddle
  • 最大公约数gcd的通俗理解和Java代码的实现
  • es6要点
  • extract-text-webpack-plugin用法
  • interface和setter,getter
  • Java-详解HashMap
  • log4j2输出到kafka
  • ng6--错误信息小结(持续更新)
  • Octave 入门
  • ReactNative开发常用的三方模块
  • React中的“虫洞”——Context
  • SwizzleMethod 黑魔法
  • 前嗅ForeSpider中数据浏览界面介绍
  • 物联网链路协议
  • 小程序01:wepy框架整合iview webapp UI
  • 小程序测试方案初探
  • 用简单代码看卷积组块发展
  • 云大使推广中的常见热门问题
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • MPAndroidChart 教程:Y轴 YAxis
  • 进程与线程(三)——进程/线程间通信
  • ​第20课 在Android Native开发中加入新的C++类
  • #pragma pack(1)
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (四)linux文件内容查看
  • (一)u-boot-nand.bin的下载
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)c++ std::pair 与 std::make
  • (转)Linux下编译安装log4cxx
  • ./和../以及/和~之间的区别
  • .bat文件调用java类的main方法
  • .libPaths()设置包加载目录
  • .NET delegate 委托 、 Event 事件
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET 服务 ServiceController
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • /var/spool/postfix/maildrop 下有大量文件
  • @RequestMapping 的作用是什么?
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [20181219]script使用小技巧.txt