springboot整合websocket
1、添加依赖
<dependency> <!-- websocket --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <dependency> <!-- fastjson --> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency>
2、添加配置文件
package com.cosmo.sandtable.configure; import com.cosmo.sandtable.service.ReceiveDataService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; import javax.annotation.PostConstruct; /** * @author 12077 */ @Configuration public class WebSocketConfig { /** * 注入一个ServerEndpointExporter,该Bean会自动注册使用@ServerEndpoint注解申明的websocket endpoint */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
package com.cosmo.sandtable.websocket; import com.cosmo.sandtable.service.ReceiveDataService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; /** * 前后端交互的类实现消息的接收推送(自己发送给所有人(不包括自己)) * * @author 12077 * @ServerEndpoint(value = "/test/oneToMany") 前端通过此URI 和后端交互,建立连接 */ @Slf4j @ServerEndpoint(value = "/sandTable") @Service public class OneToManyWebSocket { /** * 记录当前在线连接数 */ private static AtomicInteger onlineCount = new AtomicInteger(0); /** * 存放所有在线的客户端 */ private static Map<String, Session> clients = new ConcurrentHashMap<>(); private static ReceiveDataService receiveDataService; /** * 解决authwire不能注入问题 ReceiveDataService * @param receiveDataService */ @Autowired public void setApplicationContext(ReceiveDataService receiveDataService){ OneToManyWebSocket.receiveDataService=receiveDataService; } /** * 连接建立成功调用的方法 */ @OnOpen public void onOpen(Session session) { onlineCount.incrementAndGet(); // 在线数加1 clients.put(session.getId(), session); log.info("有新连接加入:{},当前在线人数为:{}", session.getId(), onlineCount.get()); receiveDataService.lightResetLoop(1); } /** * 连接关闭调用的方法 */ @OnClose public void onClose(Session session) { onlineCount.decrementAndGet(); // 在线数减1 clients.remove(session.getId()); log.info("有一连接关闭:{},当前在线人数为:{}", session.getId(), onlineCount.get()); } /** * 收到客户端消息后调用的方法 * * @param message 客户端发送过来的消息 */ @OnMessage public void onMessage(String message, Session session) { log.info("服务端收到客户端[{}]的消息:{}", session.getId(), message); this.sendMessage(message, session); } @OnError public void onError(Session session, Throwable error) { log.error("发生错误"); error.printStackTrace(); } /** * 群发消息 * * @param message 消息内容 */ private void sendMessage(String message, Session fromSession) { for (Map.Entry<String, Session> sessionEntry : clients.entrySet()) { Session toSession = sessionEntry.getValue(); // 排除掉自己 if (!fromSession.getId().equals(toSession.getId())) { log.info("服务端给客户端[{}]发送消息{}", toSession.getId(), message); toSession.getAsyncRemote().sendText(message); } } } public void sendMessage(String message) { for (Map.Entry<String, Session> sessionEntry : clients.entrySet()) { Session toSession = sessionEntry.getValue(); toSession.getAsyncRemote().sendText(message); } } }
websocket不能注入报空指针:https://blog.csdn.net/qq_40136782/article/details/109078750
https://www.cnblogs.com/xuwenjin/p/12664650.html
分类:
java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?