guoshilong
2023-03-18 667ecd7f57d7bc32b41b71cbf21b7ee9c3cbcf77
sockeio连接调整
2 files modified
1 files added
157 ■■■■■ changed files
src/main/java/org/springblade/common/handler/SocketEntity.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/common/handler/SocketIOService.java 136 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/modules/vo/FunctionVO.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/common/handler/SocketEntity.java
New file
@@ -0,0 +1,15 @@
package org.springblade.common.handler;
import lombok.Data;
@Data
public class SocketEntity {
    //当前设备号
    private String current;
    //目标设备
    private String target;
    //消息
    private String msg;
}
src/main/java/org/springblade/common/handler/SocketIOService.java
@@ -9,6 +9,7 @@
import com.corundumstudio.socketio.protocol.Packet;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.modules.modules.entity.FunctionEntity;
import org.springblade.modules.modules.entity.ModulesEntity;
import org.springblade.modules.modules.service.IFunctionService;
@@ -28,6 +29,7 @@
import javax.annotation.PreDestroy;
import java.net.ServerSocket;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -43,17 +45,7 @@
    private final Logger log = LoggerFactory.getLogger(this.getClass());
    // 用来存已连接的客户端
    private static Map<String, SocketIOClient> viewMap = new ConcurrentHashMap<>();
    // 用来存已连接的客户端
    private static Map<String, SocketIOClient> controllerMap = new ConcurrentHashMap<>();
//    // 用来存已连接的视图客户端
//    private List<Map<String, SocketIOClient>> view = new ArrayList<>();
//
//    // 用来存已连接的控制客户端
//    private List<Map<String, SocketIOClient>> controller = new ArrayList<>();
    private static Map<String, SocketIOClient> clientMap = new ConcurrentHashMap<>();
    @Autowired
    private SocketIOServer socketIOServer;
@@ -96,39 +88,7 @@
     */
    @OnConnect
    public void onConnect(SocketIOClient client) {
        FunctionVO functionEntity = getFuncVo(client);
        //判断页面和控制器是否已经连接过了
        if (functionEntity.getIsView()) {
            for (int i = 0; i < viewMap.size(); i++) {
                if (viewMap.containsKey(functionEntity.getModulesId())) {
                    client.sendEvent("connectError", R.fail("已连接"));
                    return;
                }
            }
        } else {
            for (int i = 0; i < controllerMap.size(); i++) {
                if (controllerMap.containsKey(functionEntity.getModulesId())) {
                    client.sendEvent("connectError", R.fail("已连接"));
                    return;
                }
            }
        }
        List<FunctionEntity> all = functionService.getAll(functionEntity);
        if (all.size() > 0) {
            if (functionEntity.getIsView()) {
                log.info("预览页{}", client.getSessionId().toString());
                viewMap.put(functionEntity.getModulesId(), client);
            } else {
                log.info("控制页{}", client.getSessionId().toString());
                controllerMap.put(functionEntity.getModulesId(), client);
            }
            client.sendEvent("connectOk", R.data(all));
        } else {
            client.sendEvent("connectError", R.fail("连接失败"));
        }
        log.info(client.getSessionId().toString());
    }
    /**
@@ -144,25 +104,45 @@
    }
    /**
     * 添加进clientMap
     */
    @OnEvent(value = "putInClientMap")
    public void OnEventPutInClientMap(SocketIOClient client, AckRequest ackRequest, String data) {
        FunctionEntity functionEntity = new FunctionEntity();
        SocketEntity socketEntity = parseMsg(data);
        //判断是否是控制器
        if (StringUtil.isBlank(socketEntity.getTarget())) {
            //媒体端
            functionEntity.setModulesId(socketEntity.getCurrent());
        } else {
            //控制器
            functionEntity.setModulesId(socketEntity.getTarget());
        }
        List<FunctionEntity> all = functionService.getAll(functionEntity);
        if (all.size() > 0) {
            clientMap.put(socketEntity.getCurrent(), client);
            client.sendEvent("connectOk", R.data(all));
        } else {
            client.sendEvent("connectError", R.fail("该模块不存在"));
        }
    }
    /**
     * 图册上下页控制
     */
    @OnEvent(value = "changeImgPage")
    public void OnEventImgChange(SocketIOClient client, AckRequest ackRequest, String data) {
        log.info("图册变更:" + data);
        FunctionVO funcVo = getFuncVo(client);
        viewMap.forEach((e,socketIO)->{
            if (data.equals("previous")){
                if (e.equals(funcVo.getModulesId())){
                    socketIO.sendEvent("previousPage","previous");
                }
            }else if (data.equals("next")){
                if (e.equals(funcVo.getModulesId())){
                    socketIO.sendEvent("nextPage","next");
                }
            }
        });
        SocketEntity socketEntity = parseMsg(data);
        if (socketEntity.getMsg().equals("previous")) {
            //上一页
            clientMap.get(socketEntity.getTarget()).sendEvent("previousPage", "previous");
        } else {
            //下一页
            clientMap.get(socketEntity.getTarget()).sendEvent("nextPage", "next");
        }
    }
    /**
@@ -171,13 +151,9 @@
    @OnEvent(value = "menuChange")
    public void OnEventMenuChange(SocketIOClient client, AckRequest ackRequest, String data) {
        log.info("菜单变更:" + data);
        FunctionVO funcVo = getFuncVo(client);
        viewMap.forEach((e,socketIOClient)->{
            if (e.equals(funcVo.getModulesId())){
                log.info("目标客户端:{}", socketIOClient.getSessionId().toString());
                socketIOClient.sendEvent("menuChange", data);
            }
        });
        SocketEntity socketEntity = parseMsg(data);
        log.info("目标客户端:{}", clientMap.get(socketEntity.getTarget()).getSessionId().toString());
        clientMap.get(socketEntity.getTarget()).sendEvent("menuChange", socketEntity.getMsg());
    }
    /**
@@ -187,22 +163,12 @@
     */
    @OnDisconnect()
    public void OnEvent(SocketIOClient client) {
        FunctionVO funcVo = getFuncVo(client);
        if (funcVo.getIsView()) {
            viewMap.forEach((e,socketIOClient)->{
                if (e.equals(funcVo.getModulesId())){
                    viewMap.remove(e);
                    log.info("预览页:{}断开连接", socketIOClient.getSessionId());
                }
            });
        } else {
            controllerMap.forEach((e,socketIOClient)->{
                if (e.equals(funcVo.getModulesId())){
                    controllerMap.remove(e);
                    log.info("控制页:{}断开连接", socketIOClient.getSessionId());
                }
            });
        }
        clientMap.forEach((e, socketIOClient) -> {
            if (socketIOClient.equals(client)) {
                clientMap.remove(e);
                log.info("{}断开连接", e);
            }
        });
    }
    public void stop() {
@@ -240,9 +206,11 @@
        return sa.substring(1, sa.indexOf(":"));
    }
    private FunctionVO getFuncVo(SocketIOClient client) {
        String connectInfo = client.getHandshakeData().getSingleUrlParam("connectInfo");
        return JSON.parseObject(connectInfo, FunctionVO.class);
    /**
     * 解析客户端连接请求中的参数,转化为实体类
     */
    private SocketEntity parseMsg(String msg) {
        return JSON.parseObject(msg, SocketEntity.class);
    }
src/main/java/org/springblade/modules/modules/vo/FunctionVO.java
@@ -32,10 +32,4 @@
public class FunctionVO extends FunctionEntity {
    private static final long serialVersionUID = 1L;
    private String modulesName;
    private Boolean isView;
    private String controllerId;
}