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.beans.factory.annotation.Autowired; 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 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 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--; } } }