| package com.zy.asrs.ws; | 
|   | 
| import com.alibaba.fastjson.JSON; | 
| import com.core.common.R; | 
| import com.core.common.SpringUtils; | 
| import com.zy.asrs.controller.ShuttleController; | 
| import com.zy.common.model.WebSocketMessage; | 
| 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.concurrent.CopyOnWriteArraySet; | 
|   | 
| @Component | 
| @Slf4j | 
| @Service | 
| @ServerEndpoint("/shuttle/websocket") | 
| @Data | 
| public class ShuttleWebSocket { | 
|   | 
|     //客户端在线人数 | 
|     private static int onlineClient = 0; | 
|   | 
|     //客户端池 | 
|     private static CopyOnWriteArraySet<ShuttleWebSocket> webSocketServers = new CopyOnWriteArraySet<>(); | 
|   | 
|     private Session session; | 
|   | 
|     //是否鉴权,默认未鉴权 | 
|     private boolean auth = false; | 
|   | 
|     //是否为管理员 | 
|     private boolean isAdmin = false; | 
|   | 
|     //管道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 { | 
|         ShuttleController shuttleController = SpringUtils.getBean(ShuttleController.class); | 
|         WebSocketMessage socketMessage = JSON.parseObject(message, WebSocketMessage.class); | 
|         if (socketMessage.getUrl().equals("/shuttle/table/shuttle/state")) { | 
|             R result = shuttleController.shuttleStateTable(); | 
|             socketMessage.setData(JSON.toJSONString(result)); | 
|             this.sendMessage(JSON.toJSONString(socketMessage)); | 
|         } else if (socketMessage.getUrl().equals("/shuttle/output/shuttle")) { | 
|             R result = shuttleController.steOutput(); | 
|             socketMessage.setData(JSON.toJSONString(result)); | 
|             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--; | 
|         } | 
|     } | 
|   | 
| } |