|
@@ -0,0 +1,75 @@
|
|
|
+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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|