package com.dy.pipIrrRemote.largeScreen; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import jakarta.websocket.*; import jakarta.websocket.server.PathParam; import jakarta.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.concurrent.ConcurrentHashMap; /** * @Author: liurunyu * @Date: 2025/2/10 15:25 * @Description 客户端(浏览器)每建立一个websocket连接,服务端就会创建一个WebSocketServer实例 */ @Slf4j @ServerEndpoint("/websocket/ls/{id}") @Component public class WebSocketServer { // 静态变量,记录当前在线连接数 private static int onlineCount = 0; // 存放每个客户端对应的WebSocketServer对象 private static ConcurrentHashMap webSocketMap = new ConcurrentHashMap<>(); // 客户端连接会话,通过它给客户端发送数据 private Session session; // 客户端上线时刻 //private String onLineDt ; // 客户端id private String id = ""; /** * 连接建立成功调用的方法 * @param session websocket会话对象 * @param id 客户端id */ @OnOpen public void onOpen(Session session, @PathParam("id") String id) { this.session = session; //this.onLineDt = DateTime.yyyy_MM_dd_HH_mm_ss() ; this.id = id; if(this.id == null || this.id.length() == 0){ this.id = "" + System.nanoTime() ; } this.sendMessage(WebSocketHeartBeat.getHeartBeatMessage()); if (webSocketMap.containsKey(id)) { webSocketMap.remove(id); webSocketMap.put(id, this); } else { webSocketMap.put(id, this); WebSocketServer.addOnlineCount(); } } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { if (webSocketMap.containsKey(id)) { webSocketMap.remove(id); //从set中删除 WebSocketServer.subOnlineCount(); } log.info("客户端:" + id + ",关闭了websocket"); } /** * 收到客户端消息后调用的方法 * @param message 客户端发送过来的消息 * @param session */ @OnMessage public void onMessage(String message, Session session) { log.info("客户端:" + id + ",websocket报文:" + message); } /** * 会话异常 * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { log.error("客户端:" + this.id + ",websocket会话异常,原因:" + error.getMessage()); } /** * 服务器主动推送消息 */ public void sendMessage(String message) { try{ this.session.getBasicRemote().sendText(message); }catch (Exception e){ log.error("客户端:" + id + ",websocket网络发送数据异常", e); } } /** * 服务器主动群推送消息 */ public static void sendAllMessage(String message) throws IOException { ConcurrentHashMap.KeySetView ids = webSocketMap.keySet(); for (String id : ids) { WebSocketServer webSocketServer = webSocketMap.get(id); webSocketServer.sendMessage(message); } } /** * 服务器指定客户端推送消息 */ public static void sendOneMessage(String message, String id) throws IOException { if (message != null && message.length() != 0 && webSocketMap.containsKey(id)) { webSocketMap.get(id).sendMessage(message); } else { log.error("客户端" + id + ",不在线!"); } } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { WebSocketServer.onlineCount++; } public static synchronized void subOnlineCount() { WebSocketServer.onlineCount--; } }