springboot创建websocket服务-ws方式
#pom依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
#配置类
@Configuration public class WebSocketConfig { /** * 首先在该类中注入一个ServerEndpointExporter的bean, * ServerEndpointExporter这个bean会自动注册使用了@ServerEndpoint这个注解的websocket endpoint */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
#服务端
@Slf4j @Component @ServerEndpoint("/") public class MyWebSocketServer { /** * 静态变量,用来记录当前连接数 */ private static final AtomicInteger ONLINE_COUNT = new AtomicInteger(); /** * concurrent线程安全set,用来存放每个客户端对应的MyWebSocketServer对象 */ public static final CopyOnWriteArraySet<MyWebSocketServer> WEBSOCKETS = new CopyOnWriteArraySet<>(); /** * 与每个客户端的连接会话,需要通过它来给客户端发送数据 */ private Session session; /** * 连接成功调用的方法 * * @param session 可选的参数。与某个客户端的连接会话 */ @OnOpen public void onOpen(Session session) { this.session = session; WEBSOCKETS.add(this); ONLINE_COUNT.incrementAndGet(); log.info("有新的连接加入!当前连接总数为{}", ONLINE_COUNT.get()); } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { WEBSOCKETS.remove(this); ONLINE_COUNT.decrementAndGet(); log.info("有一连接关闭!当前连接总数为{}", ONLINE_COUNT.get()); } @OnMessage public void onMessage(String message) { log.info("WebSocket接收消息:sessionId为{},消息为:{}", this.session.getId(), message); } @OnError public void onError(Session session, Throwable error) { log.error("WebSocket接收消息错误{},sessionId为{}", error.getMessage(), session.getId()); error.printStackTrace(); } public void sendMessage(String message) { log.info("WebSocket发送消息:sessionId为{},消息为:{}", this.session.getId(), message); try { this.session.getBasicRemote().sendText(message); } catch (IOException e) { log.error("WebSocket发送消息错误{},sessionId为{}", e.getMessage(), session.getId(), e); } } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } MyWebSocketServer that = (MyWebSocketServer) o; return Objects.equals(session, that.session); } @Override public int hashCode() { return Objects.hash(session); } }
#连接地址
ws://ip:port/context-path/webSocket
#在线测试地址
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)