| 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<String, WebSocketServer> 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<String, WebSocketServer> 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--; | 
|     } | 
| } |