67 lines
2.3 KiB
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); // 异步发送避免阻塞
|
|
}
|
|
}
|
|
}
|
|
} |