websocket demo
引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
配置文件
@Configuration public class WebSocketConfiguration { /** * 注入ServerEndpointExporter, * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
处理消息
@Component @Slf4j @ServerEndpoint("/websocket/{userId}") public class WebSocket { /** * 线程安全的无序的集合 */ private static final CopyOnWriteArraySet<Session> SESSIONS = new CopyOnWriteArraySet<>(); /** * 存储在线连接数 */ private static final Map<String, Session> SESSION_POOL = new HashMap<>(); @OnOpen public void onOpen(Session session, @PathParam(value = "userId") String userId) { try { SESSIONS.add(session); SESSION_POOL.put(userId, session); log.info("【WebSocket消息】有新的连接,总数为:" + SESSIONS.size()); } catch (Exception e) { e.printStackTrace(); } } @OnClose public void onClose(Session session) { try { SESSIONS.remove(session); log.info("【WebSocket消息】连接断开,总数为:" + SESSIONS.size()); } catch (Exception e) { e.printStackTrace(); } } @OnMessage public void onMessage(String message) { log.info("【WebSocket消息】收到客户端消息:" + message); } /** * 此为广播消息 * * @param message 消息 */ public void sendAllMessage(String message) { log.info("【WebSocket消息】广播消息:" + message); for (Session session : SESSIONS) { try { if (session.isOpen()) { session.getAsyncRemote().sendText(message); } } catch (Exception e) { e.printStackTrace(); } } } /** * 此为单点消息 * * @param userId 用户编号 * @param message 消息 */ public void sendOneMessage(String userId, String message) { Session session = SESSION_POOL.get(userId); if (session != null && session.isOpen()) { try { synchronized (session) { log.info("【WebSocket消息】单点消息:" + message); session.getAsyncRemote().sendText(message); } } catch (Exception e) { e.printStackTrace(); } } } /** * 此为单点消息(多人) * * @param userIds 用户编号列表 * @param message 消息 */ public void sendMoreMessage(String[] userIds, String message) { for (String userId : userIds) { Session session = SESSION_POOL.get(userId); if (session != null && session.isOpen()) { try { log.info("【WebSocket消息】单点消息:" + message); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); } } } } }
@ServerEndpoint:将目前的类定义成一个websocket服务器端,注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
@OnOpen:当WebSocket建立连接成功后会触发这个注解修饰的方法。
@OnClose:当WebSocket建立的连接断开后会触发这个注解修饰的方法。
@OnMessage:当客户端发送消息到服务端时,会触发这个注解修改的方法。
@OnError:当WebSocket建立连接时出现异常会触发这个注解修饰的方法。
我只想安静地学习,捡拾前人的牙慧,默默强大如此弱小的我...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通