| 
					
				 | 
			
			
				@@ -1,2 +1,75 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-package com.usky.alarm.service.config.websocket;public class WebSocketPatrol { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+package com.usky.alarm.service.config.websocket; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import cn.hutool.json.JSONUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.stereotype.Component; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import javax.websocket.OnClose; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import javax.websocket.OnMessage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import javax.websocket.OnOpen; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import javax.websocket.Session; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import javax.websocket.server.PathParam; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import javax.websocket.server.ServerEndpoint; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.io.IOException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.Iterator; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.Map; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.concurrent.ConcurrentHashMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@ServerEndpoint(value = "/webSocketPatrol/{userId}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@Component 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class WebSocketPatrol { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static ConcurrentHashMap<String, WebSocketPatrol> webSocketMap = new ConcurrentHashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //实例一个session,这个session是websocket的session 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private Session session; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //新增一个方法用于主动向客户端发送消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void sendMessage(Object message, String userId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Iterator<Map.Entry<String, WebSocketPatrol>> iterator = webSocketMap.entrySet().iterator(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        while (iterator.hasNext()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Map.Entry<String, WebSocketPatrol> entry = iterator.next(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int index = entry.getKey().indexOf(","); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String result = entry.getKey().substring(0, index); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (result.equals(userId)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (entry.getValue() != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        entry.getValue().session.getBasicRemote().sendText(JSONUtil.toJsonStr(message)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        System.out.println("【websocket消息】发送消息成功,用户=" + userId + ",消息内容" + message.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } catch (IOException e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        e.printStackTrace(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static ConcurrentHashMap<String, WebSocketPatrol> getWebSocketMap() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return webSocketMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static void setWebSocketMap(ConcurrentHashMap<String, WebSocketPatrol> webSocketMap) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        WebSocketPatrol.webSocketMap = webSocketMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //前端请求时一个websocket时 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @OnOpen 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void onOpen(Session session, @PathParam("userId") String userId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        this.session = session; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        webSocketMap.put(userId, this); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        sendMessage("CONNECT_SUCCESS", userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        System.out.println("【websocket消息】有新的连接,连接id" + userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //前端关闭时一个websocket时 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @OnClose 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void onClose(@PathParam("userId") String userId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        webSocketMap.remove(userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        System.out.println("【websocket消息】连接断开,总数:" + webSocketMap.size()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //前端向后端发送消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @OnMessage 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void onMessage(String message) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!message.equals("ping")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            System.out.println("【websocket消息】收到客户端发来的消息:" + message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |