package com.mir4updater.backend.service; import jakarta.websocket.OnClose; import jakarta.websocket.OnMessage; import jakarta.websocket.OnOpen; import jakarta.websocket.Session; import jakarta.websocket.server.PathParam; import jakarta.websocket.server.ServerEndpoint; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.stereotype.Component; import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @Component @ServerEndpoint("/websocket/{terminalId}") public class WebSocketService { private static final Map CLIENTS = new ConcurrentHashMap<>(); public static Logger logger = LogManager.getLogger(WebSocketService.class); @OnOpen public void onOpen(@PathParam("terminalId") String terminalId, Session session) { if (CLIENTS.containsKey(terminalId)) { try { CLIENTS.get(terminalId).close(); } catch (IOException e) { throw new RuntimeException(e); } } CLIENTS.put(terminalId, session); logger.info(session.getId()); logger.info("终端 {} 已连接,当前在线数:{}", terminalId, CLIENTS.size()); } @OnClose public void onClose(@PathParam("terminalId") String terminalId, Session session) { CLIENTS.remove(terminalId); logger.info(session.getId()); logger.info("终端 {} 已断开", terminalId); } @OnMessage public void onMessage(String message, Session session) { logger.info(session.getId()); logger.info("收到消息:{}", message); } // 推送消息方法 public static void sendMessage(String terminalId, String message) { Session session = CLIENTS.get(terminalId); if (session != null && session.isOpen()) { session.getAsyncRemote().sendText(message); // 异步发送避免阻塞 } } public static void sendMessageAll(String message) { for (Map.Entry entry : CLIENTS.entrySet()) { Session session = entry.getValue(); if (session != null && session.isOpen()) { session.getAsyncRemote().sendText(message); // 异步发送避免阻塞 } } } }