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<ConsoleWebSocket> 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--;
|
}
|
}
|
|
}
|