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

websocket 在spingboot 中使用

websocket 在spingboot 中使用

springboot 中已存在 websocket 的依赖,不需要添加额外的依赖。


内容部分

config 配置

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;/*** @author * @description WebSocketConfig* @date 2026-02-06 14:56*/
@Configuration
public class WebSocketConfig {/*** 注册ServerEndpointExporter,让Spring扫描@ServerEndpoint注解* SpringBoot内置容器(Tomcat/Jetty)必须加,外部容器可省略*/@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}

server 配置

在同一个server 中只能进行同一个 业务 操作,也只能使用同一个ConcurrentHashMap,
如果使用相同的map,在进行广播的时候,则会影响到其他的业务操作。
可以在 @ServerEndpoint("/ws/connect") 中进行配置,进行多个业务连接通信。

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** @author * @description WebSocketServer* WebSocket服务端*  * @ServerEndpoint:指定WebSocket连接路径,前端通过 ws://ip:端口/ws/connect 连接*  ws://localhost:8321/ws/connect*  * @Component:让Spring管理这个Bean,配合ServerEndpointExporter扫描* @date 2026-02-06 14:57*/
@Slf4j
@ServerEndpoint("/ws/connect")
@Component
public class WebSocketServer {// 存储所有在线会话:key=会话ID,value=会话对象(ConcurrentHashMap保证线程安全)private static final Map<String, Session> ONLINE_SESSIONS = new ConcurrentHashMap<>();// 会话ID(每个连接唯一)private String sessionId;/*** 【核心】连接建立成功时触发** @param session 会话对象:代表当前客户端与服务端的WebSocket连接*/@OnOpenpublic void onOpen(Session session) {this.sessionId = session.getId();ONLINE_SESSIONS.put(sessionId, session);log.info("WebSocket连接建立:会话ID={},当前在线人数={}", sessionId, ONLINE_SESSIONS.size());// 连接成功后,主动给客户端回传一条消息sendMessageToClient(session, "恭喜,WebSocket连接成功!会话ID:" + sessionId);}/*** 【核心】接收客户端发送的消息时触发** @param message 客户端发送的消息内容* @param session 当前客户端会话*/@OnMessagepublic void onMessage(String message, Session session) {log.info("收到客户端消息:会话ID={},消息内容={}", sessionId, message);// 方式1:给当前客户端**回传消息**(回声测试,最基础)sendMessageToClient(session, "服务端已收到你的消息,内容:" + message);// 方式2:**广播消息**(给所有在线客户端发送,可选测试)// broadcastMessage("【会话ID=" + sessionId + "】:" + message);}/*** 【核心】连接关闭时触发(客户端关闭页面/主动断开)*/@OnClosepublic void onClose(Session session) {ONLINE_SESSIONS.remove(sessionId);log.info("WebSocket连接关闭:会话ID={},当前在线人数={}", sessionId, ONLINE_SESSIONS.size());}/*** 【核心】WebSocket连接发生异常时触发** @param error 异常对象*/@OnErrorpublic void onError(Session session, Throwable error) {log.error("WebSocket连接异常:会话ID={},异常信息={}", sessionId, error.getMessage(), error);ONLINE_SESSIONS.remove(sessionId);}// 私有方法:给单个客户端发送消息private void sendMessageToClient(Session session, String message) {try {// getBasicRemote():同步发送消息;getAsyncRemote():异步发送(推荐高并发)session.getBasicRemote().sendText(message);} catch (Exception e) {log.error("给客户端发送消息失败:会话ID={}", sessionId, e);}}// 公有方法:广播消息(给所有在线客户端,可选测试)public void broadcastMessage(String message) {ONLINE_SESSIONS.values().forEach(session -> sendMessageToClient(session, message));}
}

测试

采取 Schedule 发送定时任务方式 判断是否可以获取到服务端发送的内容,代码如下

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import com.lt.ws.server.WebSocketServer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import java.util.Date;/*** @author * @description WsTask* @date 2026-02-06 15:09*/
@Component
@Slf4j
public class WsTask {@Autowiredprivate WebSocketServer webSocketServer;private final static int synDataTime = 30 * 60 * 1000;//    private final static  int pushDataTime = 10 * 60 * 1000;private final static int pushDataTime = 10 * 1000;@Scheduled(fixedRate = pushDataTime)public void task1() {log.info("测试任务执行");}private static String getCurrentStrTime() {return DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss");}/*** 发送广播消息*/@Scheduled(fixedRate = pushDataTime)public void pushWsBroadcastMessage() {this.webSocketServer.broadcastMessage(getCurrentStrTime() + " :: " + IdUtil.fastUUID());}
}

连接服务测试

本次测试采用的是 api fox 连接测试
ws://localhost:8321/ws/connect
ws://ip:port/endpoint
可以观察到控制台输出内容为 task中输出内容。

http://www.jsqmd.com/news/369324/

相关文章:

  • 人工智能应用- 人机对战:06. 自我对弈
  • 人工智能应用- 人机对战:04. 蒙特卡洛树搜索
  • CF1705E Mark and Professor Koro
  • 人工智能应用- 人机对战:05. 深度神经网络
  • .venv 虚拟环境创建、激活、
  • 书匠策AI:本科论文写作的“智能魔法学院”全攻略
  • 照着用就行:千笔写作工具,全网顶尖的AI论文网站
  • 解锁论文写作新姿势:书匠策AI——本科生的“学术外挂”指南
  • 解锁论文写作新次元:书匠策AI,本科生科研的“智慧外挂”
  • 雨量监测站 雨量实时监测系统
  • RuoYi Office 全景介绍:一个平台管好整个企业
  • 大模型实习模拟面试之Agent小厂二面:从项目实战到幻觉抑制的深度拷问
  • 学术探险家的秘密地图:书匠策AI解锁本科论文写作新宇宙
  • 横评后发现!领军级的降AIGC平台 —— 千笔·降AIGC助手
  • 大模型实习模拟面试之有赞Agent开发实习一面:从Token本质到MCP安全校验的全栈视角深度复盘
  • 2026年软件开发热门团队:口碑与实力并存,小程序开发/软件开发/APP开发/网络公司/网站建设,软件开发企业选哪家 - 品牌推荐师
  • 从品牌到性能:2026年如何选择质量可靠的金属拉力试验机生产商 - 品牌推荐大师
  • VS Code
  • 加油卡回收靠谱吗?团团收奉上避坑指南与可靠推荐 - 团团收购物卡回收
  • 国康20年:构建卓越健康管理体系,从守护生命到未来为10万企业家建立健康档案
  • 每日面试题分享179:Redis的持久化机制有哪些?
  • 纯 CSS 实现无限楼梯动画效果,视觉欺骗也能这么好玩
  • 专科生必看!最受喜爱的AI论文网站 —— 千笔·专业学术智能体
  • 无人机培训学校哪家性价比高,AOPA培训价格大揭秘 - mypinpai
  • 2026年京津冀地区靠谱的税务规划共享财务机构排名 - 工业品网
  • 每日面试题分享180:如果发现Redis内存溢出了怎么办?
  • 2026年工业除尘器领域企业推荐:张家港市鑫圣威机械有限公司,除尘器配件及多类型除尘器专业供应商 - 品牌推荐官
  • 2026年中山PVC地板生产厂排名,口碑好售后佳的厂家有哪些? - 工业推荐榜
  • 2026通风天窗厂家推荐:靖江市坦贝尔环境科技,多类型排烟通风天窗专业制造 - 品牌推荐官
  • Boost电路 simulink 仿真 boost 电路模块搭建和用传递函数进行验证 电流开环...