//package org.jeecg.modules.dry.websocket; // //import cn.hutool.core.bean.BeanUtil; //import com.alibaba.fastjson.JSON; //import com.alibaba.fastjson.JSONObject; //import lombok.extern.slf4j.Slf4j; //import org.jeecg.common.constant.DrySocketConst; //import org.jeecg.common.util.SpringContextUtils; //import org.jeecg.modules.dry.service.IDryRealTimeDataService; //import org.jeecg.modules.dry.vo.RealTimeDataVo; //import org.springframework.beans.factory.annotation.Autowired; //import org.springframework.stereotype.Component; // //import javax.websocket.*; //import javax.websocket.server.PathParam; //import javax.websocket.server.ServerEndpoint; //import java.util.Collection; //import java.util.HashMap; //import java.util.Map; // //@Slf4j //@Component //@ServerEndpoint("/drySocket/{tenantId}/{machineId}") //public class DrySocket { // // /** // * 当前 session // */ // private Session session; // /** // * 当前租户id // */ // private String tenantId; // /** // * 设备id,用于标识同一租户,不同设备的数据 // */ // private String machineId; // /** // * 当前socket唯一id // */ // private String socketId; // // /** // * 租户连接池,包含单个租户的所有socket连接; // * 因为一个租户可能打开多个设备,多个设备就会有多个连接; // * key是tenantId,value是Map对象;子Map的key是machineId,value是drySocket对象 // */ // private Map> tenantPool = new HashMap<>(); // /** // * 连接池,包含所有WebSocket连接; // * key是socketId,value是drySocket对象 // */ // private Map machinePool = new HashMap<>(); // // /** // * 获取某个租户所有的设备 // */ // public Map getTenantPool(String tenantId) { // return tenantPool.computeIfAbsent(tenantId, k -> new HashMap<>(5)); // } // // /** // * 向当前租户发送消息 // * // * @param message 消息内容 // */ // public void sendMessage(String message) { // try { // this.session.getAsyncRemote().sendText(message); // } catch (Exception e) { // log.error("【drySocket】消息发送失败:" + e.getMessage()); // } // } // // /** // * 封装消息json // * // * @param data 消息内容 // */ // public static String packageMessage(String type, Object data) { // JSONObject message = new JSONObject(); // message.put(DrySocketConst.TYPE, type); // message.put(DrySocketConst.DATA, data); // return message.toJSONString(); // } // // /** // * 向指定租户的所有设备发送消息 // * // * @param tenantId 接收消息的租户ID // * @param message 消息内容 // */ // public void sendMessageTo(String tenantId, String message) { // Collection values = getTenantPool(tenantId).values(); // if (values.size() > 0) { // for (DrySocket socketItem : values) { // socketItem.sendMessage(message); // } // } else { // log.warn("【drySocket】消息发送失败:tenantId\"" + tenantId + "\"不存在或未在线!"); // } // } // // /** // * 向指定租户的指定设备发送消息 // * // * @param tenantId 接收消息的租户ID // * @param message 消息内容 // */ // public void sendMessageTo(String tenantId, String machineId, String message) { // DrySocket socketItem = getTenantPool(tenantId).get(machineId); // if (socketItem != null) { // socketItem.sendMessage(message); // } else { // log.warn("【drySocket】消息发送失败:tenantId\"" + tenantId + "\"的machineId\"" + machineId + "\"不存在或未在线!"); // } // } // // /** // * 向多个租户的所有设备发送消息 // * // * @param tenantIds 接收消息的租户ID数组 // * @param message 消息内容 // */ // public void sendMessageTo(String[] tenantIds, String message) { // for (String tenantId : tenantIds) { // this.sendMessageTo(tenantId, message); // } // } // // /** // * 向所有租户的所有设备发送消息 // * // * @param message 消息内容 // */ // public void sendMessageToAll(String message) { // for (DrySocket socketItem : machinePool.values()) { // socketItem.sendMessage(message); // } // } // // /** // * websocket 开启连接 // */ // @OnOpen // public void onOpen(Session session, @PathParam("tenantId") String tenantId, @PathParam("machineId") String machineId) { // try { // this.tenantId = tenantId; // this.machineId = machineId; // this.socketId = tenantId + machineId; // this.session = session; // // machinePool.put(this.socketId, this); // getTenantPool(tenantId).put(this.machineId, this); // // log.info("【drySocket】有新的连接,总数为:" + machinePool.size()); // log.info("ssss"+tenantPool.size()); // } catch (Exception ignored) { // } // } // // /** // * websocket 断开连接 // */ // @OnClose // public void onClose() { // try { // machinePool.remove(this.socketId); // getTenantPool(this.tenantId).remove(this.machineId); // // log.info("【drySocket】连接断开,总数为:" + machinePool.size()); // } catch (Exception ignored) { // } // } // // /** // * websocket 收到消息 // */ // @OnMessage // public void onMessage(String message) { // log.info("【drySocket】onMessage:" + message); // IDryRealTimeDataService realTimeDataService = SpringContextUtils.getBean(IDryRealTimeDataService.class); // JSONObject json; // try { // json = JSON.parseObject(message); // } catch (Exception e) { // log.warn("【drySocket】收到不合法的消息:" + message); // return; // } // String type = json.getString(DrySocketConst.TYPE); // switch (type) { // // 心跳检测 // case DrySocketConst.TYPE_HB: // this.sendMessage(DrySocket.packageMessage(type, true)); // break; // // 实时数据处理 // case DrySocketConst.TYPE_RDT: // Object o = json.get(DrySocketConst.DATA); // RealTimeDataVo realTimeDataVo = BeanUtil.toBean(o, RealTimeDataVo.class); // realTimeDataService.realTimeDataHandle(realTimeDataVo); // break; // // default: // log.warn("【drySocket】收到不识别的消息类型:" + type); // break; // } // // // } // // /** * 配置错误信息处理 * @param session * @param t */ // @OnError // public void onError(Session session, Throwable t) { // ////什么都不想打印都去掉就好了 // log.info("【websocket消息】出现未知错误 "); ////打印错误信息,如果你不想打印错误信息,去掉就好了 ////这里打印的也是 java.io.EOFException: null // t.printStackTrace(); // } // // //}