Files
Mir4UpdaterBackend/src/main/java/com/mir4updater/backend/service/WebSocketService.java

67 lines
2.3 KiB
Java

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<String, Session> 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<String, Session> entry : CLIENTS.entrySet()) {
Session session = entry.getValue();
if (session != null && session.isOpen()) {
session.getAsyncRemote().sendText(message); // 异步发送避免阻塞
}
}
}
}