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.ConsoleController; import com.zy.asrs.controller.LiftController; 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("/console/websocket") @Data public class ConsoleWebSocket { //客户端在线人数 private static int onlineClient = 0; //客户端池 private static CopyOnWriteArraySet 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); LiftController liftController = SpringUtils.getBean(LiftController.class); ConsoleController consoleController = SpringUtils.getBean(ConsoleController.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("/lift/table/lift/state")) { R result = liftController.liftStateTable(); socketMessage.setData(JSON.toJSONString(result)); this.sendMessage(JSON.toJSONString(socketMessage)); } else if (socketMessage.getUrl().equals("/console/map/auth")) { R result = consoleController.getMapFromRedis(Integer.parseInt(socketMessage.getData())); 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 (ConsoleWebSocket item : webSocketServers) { item.sendMessage(message); } } public void sendMessage(String message, int userId) throws IOException { for (ConsoleWebSocket item : webSocketServers) { item.sendMessage(message); } } /** * 服务器主动推送给指定用户 */ public static boolean sendMessageGlobal(String message, String account) throws IOException { boolean tag = false; for (ConsoleWebSocket item : webSocketServers) { tag = true; item.sendMessage(message); } return tag; } public static boolean sendMessageGlobal(String message, int userId) throws IOException { boolean tag = false; for (ConsoleWebSocket item : webSocketServers) { tag = true; item.sendMessage(message); } return tag; } public static synchronized int getOnlineClient() { return onlineClient; } public static synchronized void addOnlineClient() { ConsoleWebSocket.onlineClient++; } public static synchronized void subOnlineClient() { if (ConsoleWebSocket.onlineClient > 0) { ConsoleWebSocket.onlineClient--; } } }