| package com.zy.asrs.wcs.rcs.ws; | 
|   | 
| import com.alibaba.fastjson.JSON; | 
| import com.alibaba.fastjson.JSONObject; | 
| import com.zy.asrs.framework.common.R; | 
| import com.zy.asrs.framework.common.SpringUtils; | 
| import com.zy.asrs.wcs.common.config.ConfigProperties; | 
| import com.zy.asrs.wcs.common.security.JwtSubject; | 
| import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol; | 
| import com.zy.asrs.wcs.rcs.service.ShuttleService; | 
| import com.zy.asrs.wcs.rcs.ws.model.WebSocketMessage; | 
| import com.zy.asrs.wcs.utils.JwtUtil; | 
| import io.jsonwebtoken.Claims; | 
| import lombok.Data; | 
| import lombok.extern.slf4j.Slf4j; | 
| import org.springframework.stereotype.Component; | 
| import org.springframework.stereotype.Service; | 
|   | 
| import javax.websocket.*; | 
| import javax.websocket.server.ServerEndpoint; | 
| import java.io.IOException; | 
| import java.util.List; | 
| import java.util.concurrent.CopyOnWriteArraySet; | 
|   | 
| @Component | 
| @Slf4j | 
| @Service | 
| @ServerEndpoint("/ws/shuttle/websocket") | 
| @Data | 
| public class ShuttleWebSocket { | 
|   | 
|     //客户端在线人数 | 
|     private static int onlineClient = 0; | 
|   | 
|     //客户端池 | 
|     private static CopyOnWriteArraySet<ShuttleWebSocket> webSocketServers = new CopyOnWriteArraySet<>(); | 
|   | 
|     private Session session; | 
|   | 
|     private String username; | 
|   | 
|     private Long hostId; | 
|   | 
|     //管道ID | 
|     private String sessionId; | 
|   | 
|     @OnOpen | 
|     public void onOpen(Session session) { | 
|         this.session = session; | 
|         this.sessionId = session.getId(); | 
|   | 
|         //将websocket对象进行保存 | 
|         webSocketServers.add(this); | 
|         //添加在线人数 | 
|         addOnlineClient(); | 
|         log.info("有新窗口开始监听:" + session.getId() + ",当前在线人数为:" + getOnlineClient()); | 
|     } | 
|   | 
|     /** | 
|      * 连接关闭调用的方法 | 
|      */ | 
|     @OnClose | 
|     public void onClose() { | 
|         webSocketServers.remove(this);  //从set中删除 | 
|         subOnlineClient();           //在线数减1 | 
|         log.info("关闭的连接:" + sessionId); | 
|         log.info("有一连接关闭!当前在线人数为" + getOnlineClient()); | 
|     } | 
|   | 
|     /** | 
|      * 收到客户端消息后调用的方法 | 
|      * @ Param message 客户端发送过来的消息 | 
|      */ | 
|     @OnMessage | 
|     public void onMessage(String message, Session session) throws IOException { | 
|         ShuttleService shuttleService = SpringUtils.getBean(ShuttleService.class); | 
|         WebSocketMessage socketMessage = JSON.parseObject(message, WebSocketMessage.class); | 
|         if (socketMessage.getUrl().equals("login")) { | 
|             try { | 
|                 // 解析token | 
|                 ConfigProperties configProperties = SpringUtils.getBean(ConfigProperties.class); | 
|                 JSONObject data = JSON.parseObject(socketMessage.getData()); | 
|                 Claims claims = JwtUtil.parseToken(data.getString("token"), configProperties.getTokenKey()); | 
|                 JwtSubject jwtSubject = JwtUtil.getJwtSubject(claims); | 
|                 this.username = jwtSubject.getUsername(); | 
|                 this.hostId = jwtSubject.getHostId(); | 
|                 socketMessage.setData(JSON.toJSONString(R.ok("auth success"))); | 
|             } catch (Exception e) { | 
|                 e.printStackTrace(); | 
|                 socketMessage.setData(JSON.toJSONString(R.error("auth fail"))); | 
|             } | 
|             this.sendMessage(JSON.toJSONString(socketMessage)); | 
|         } else if (socketMessage.getUrl().equals("/shuttle/status/list")) { | 
|             if (this.hostId != null) { | 
|                 List<ShuttleProtocol> data = shuttleService.getShuttleStatusList(this.hostId); | 
|                 socketMessage.setData(JSON.toJSONString(data)); | 
|                 this.sendMessage(JSON.toJSONString(socketMessage)); | 
|             } | 
|         } | 
| //        log.info("收到来自连接:" + sessionId + "的信息:" + message); | 
|     } | 
|   | 
|     /** | 
|      * @ Param session | 
|      * @ Param error | 
|      */ | 
|     @OnError | 
|     public void onError(Session session, Throwable error) { | 
|         log.error("发生错误"); | 
|         error.printStackTrace(); | 
|     } | 
|   | 
|     /** | 
|      * 实现服务器主动推送 | 
|      */ | 
|     public void sendMessage(String message) throws IOException { | 
|         this.session.getBasicRemote().sendText(message); | 
|     } | 
|   | 
|     /** | 
|      * 服务器主动推送给指定用户 | 
|      */ | 
|     public void sendMessage(String message, String account) throws IOException { | 
|         for (ShuttleWebSocket item : webSocketServers) { | 
|             item.sendMessage(message); | 
|         } | 
|     } | 
|   | 
|     public void sendMessage(String message, int userId) throws IOException { | 
|         for (ShuttleWebSocket item : webSocketServers) { | 
|             item.sendMessage(message); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 服务器主动推送给指定用户 | 
|      */ | 
|     public static boolean sendMessageGlobal(String message, String account) throws IOException { | 
|         boolean tag = false; | 
|         for (ShuttleWebSocket item : webSocketServers) { | 
|             tag = true; | 
|             item.sendMessage(message); | 
|         } | 
|         return tag; | 
|     } | 
|   | 
|     public static boolean sendMessageGlobal(String message, int userId) throws IOException { | 
|         boolean tag = false; | 
|         for (ShuttleWebSocket item : webSocketServers) { | 
|             tag = true; | 
|             item.sendMessage(message); | 
|         } | 
|         return tag; | 
|     } | 
|   | 
|     public static synchronized int getOnlineClient() { | 
|         return onlineClient; | 
|     } | 
|   | 
|     public static synchronized void addOnlineClient() { | 
|         ShuttleWebSocket.onlineClient++; | 
|     } | 
|   | 
|     public static synchronized void subOnlineClient() { | 
|         if (ShuttleWebSocket.onlineClient > 0) { | 
|             ShuttleWebSocket.onlineClient--; | 
|         } | 
|     } | 
|   | 
| } |