From f05b0c2641a78ed0d5a9eb864d7e22a7757c95a2 Mon Sep 17 00:00:00 2001 From: zhouwei <849588297@qq.com> Date: Wed, 4 Mar 2026 17:18:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BA=A2=E4=B8=AD=E9=83=A8?= =?UTF-8?q?=E5=88=86log=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/robot/mj/EXGameController.java | 5 -- .../java/robot/mj/RobotConnectionManager.java | 62 +++++++++++-------- .../java/robot/mj/handler/HuNanHongZhong.java | 48 +++++++++++--- .../robot/mj/thread/ThreadPoolConfig.java | 2 +- 4 files changed, 76 insertions(+), 41 deletions(-) diff --git a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/EXGameController.java b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/EXGameController.java index 353fb8b..ce5b81f 100644 --- a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/EXGameController.java +++ b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/EXGameController.java @@ -392,11 +392,6 @@ public class EXGameController extends GameController { robotConnectionManager.disconnectFromGameServer(connecId); } }, 15, TimeUnit.SECONDS); - //15秒后还没有建立映射关系 加入可能失败 - if (robotRoomMapping.get(robotUser.getConnecId()) == null) { - log.info("机器人{}加入房间{}超时,清理临时状态", robotId, roomId); - robotConnectionManager.disconnectFromGameServer(connecId); - } } catch (Exception e) { log.error("机器人加入房间超时", e); } diff --git a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/RobotConnectionManager.java b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/RobotConnectionManager.java index b6f1c36..a1cb25c 100644 --- a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/RobotConnectionManager.java +++ b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/RobotConnectionManager.java @@ -9,7 +9,8 @@ import com.taurus.core.events.IEventListener; import com.taurus.core.plugin.redis.Redis; import com.taurus.core.util.ICallback; import com.taurus.core.util.StringUtil; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import robot.mj.business.AccountBusiness; import robot.mj.handler.HuNanHongZhong; import robot.mj.info.RobotUser; @@ -31,8 +32,8 @@ import static robot.mj.thread.ThreadPoolConfig.scheduleDelay; */ public class RobotConnectionManager { - private static final Map huNanHongZhongInstances = new ConcurrentHashMap<>(); - private static final Logger log = Logger.getLogger(RobotConnectionManager.class); + private final Map huNanHongZhongInstances = new ConcurrentHashMap<>(); + private static final Logger log = LoggerFactory.getLogger(RobotConnectionManager.class); //记录活跃连接 用于资源清理判断 private static final Set activeConnections = ConcurrentHashMap.newKeySet(); @@ -106,6 +107,7 @@ public class RobotConnectionManager { return client; } catch (Exception e) { + log.error("连接到游戏服务器时发生异常: " + connecId, e); return null; } } @@ -114,7 +116,7 @@ public class RobotConnectionManager { * 断开与游戏服务器的连接(主动断开) */ public void disconnectFromGameServer(String connecId) { - log.info("开始主动断开连接: {"+connecId+"}"); + log.info("开始主动断开连接:{}", connecId); RobotUser robotUser = robotRoomMapping.remove(connecId); //标记连接为非活跃 @@ -124,34 +126,37 @@ public class RobotConnectionManager { //清理连接数据 if (connecId != null) { HuNanHongZhong.removeFromRedis(connecId); - + HuNanHongZhong instance = huNanHongZhongInstances.get(connecId); if (instance != null) { //清理所有集合数据以释放内存 instance.getHongZhongCardInhand().clear(); instance.getChuGuoCardInhand().clear(); - log.info("清理HuNanHongZhong集合数据: " + connecId); + log.info("清理 HuNanHongZhong 集合数据:{}", connecId); } - + //移除实例 huNanHongZhongInstances.remove(connecId); - - log.info("清理完成,当前活跃连接数: " + activeConnections.size() + ", 实例数: " + huNanHongZhongInstances.size()); + + log.info("清理完成,当前活跃连接数:{}, 实例数:{}", activeConnections.size(), huNanHongZhongInstances.size()); } if (robotUser != null) { TaurusClient client = robotUser.getClient(); if (client != null) { try { + //先检查连接状态,再断开 if (client.isConnected()) { client.killConnection(); + log.info("客户端连接已强制断开:{}", connecId); + } else { + log.info("客户端连接已经断开:{}", connecId); } - log.info("客户端主动断开连接完成: {"+connecId+"}"); } catch (Exception e) { - log.error("断开客户端连接时发生异常: " + connecId + ", 错误: " + e.getMessage()); + log.error("断开客户端连接时发生异常:{}, 错误:{}", connecId, e.getMessage()); } } else { - log.info("客户端连接不存在: {"+connecId+"}"); + log.info("客户端连接不存在:{}", connecId); } //同时清理机器人房间映射 @@ -192,17 +197,21 @@ public class RobotConnectionManager { IEventListener messageListener = new IEventListener() { @Override public void handleEvent(Event event) { - //获取 msg - Message message = (Message) event.getParameter("msg"); - - ITObject param = message.param; - //回调协议号 - String command = message.command; - - //根据玩法ID处理不同的回调 - if (StringUtil.isNotEmpty(command)) { - //直接处理协议 - handleProtocol(command, message, client, connecId); + try { + //获取 msg + Message message = (Message) event.getParameter("msg"); + + ITObject param = message.param; + //回调协议号 + String command = message.command; + + //根据玩法 ID 处理不同的回调 + if (StringUtil.isNotEmpty(command)) { + //直接处理协议 + handleProtocol(command, message, client, connecId); + } + } catch (Exception e) { + log.error("处理游戏协议时发生异常:connecId: {}, command: {}", connecId, ((Message)event.getParameter("msg")).command, e); } } }; @@ -214,6 +223,9 @@ public class RobotConnectionManager { Message message = (Message) event.getParameter("msg"); SocketCode code = (SocketCode) event.getParameter("code"); + if (code == SocketCode.Connect) { + log.info("连接建立成功:connecId: {}", connecId); + } } }; @@ -393,10 +405,10 @@ public class RobotConnectionManager { huNanHongZhong.getChuGuoCardInhand().clear(); log.info("红中结算"); Integer type = param.getInt("type"); - if (type == 1 || type == 2) { //为1 为大结算 为2为解散,都需要恢复数据 + if (type == 1 || type == 2) { //为1为大结算 为2为解散 //更新机器人剩余数量 updateLeftoverRobot(Integer.parseInt(robotUser.getRobotId())); - + //游戏结束后主动断开连接 disconnectFromGameServer(connecId); } diff --git a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/handler/HuNanHongZhong.java b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/handler/HuNanHongZhong.java index 2cbc3e0..0b39e48 100644 --- a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/handler/HuNanHongZhong.java +++ b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/handler/HuNanHongZhong.java @@ -23,7 +23,7 @@ import static robot.mj.thread.ThreadPoolConfig.getBusinessThreadPool; public class HuNanHongZhong { private static final Logger log = LoggerFactory.getLogger(HuNanHongZhong.class); - public static int hongZhongCard = 0; + public int hongZhongCard = 0; //红中麻将手牌 private final List hongZhongCardInhand = new ArrayList<>(); @@ -32,15 +32,14 @@ public class HuNanHongZhong { private final List hongZhongchuguopai = new ArrayList<>(); // 玩家座位号 - public static int seat = 0; - - public static int playerId = 0; + public int seat = 0; + public int playerId = 0; // 会话标识 - public static String session = ""; + public String session = ""; // 访问令牌 - public static String token = ""; + public String token = ""; private static HongZhongSuanFaTest hongZhongSuanFaTest = new HongZhongSuanFaTest(); @@ -54,6 +53,30 @@ public class HuNanHongZhong { public List getChuGuoCardInhand() { return hongZhongchuguopai; } + + public int getSeat() { + return seat; + } + + public void setSeat(int seat) { + this.seat = seat; + } + + public int getPlayerId() { + return playerId; + } + + public void setPlayerId(int playerId) { + this.playerId = playerId; + } + + public int getHongZhongCard() { + return hongZhongCard; + } + + public void setHongZhongCard(int hongZhongCard) { + this.hongZhongCard = hongZhongCard; + } @@ -176,8 +199,9 @@ public class HuNanHongZhong { if (param == null) { return null; } - hongZhongCard = param.getInt("card"); - log.info("出牌广播: {}", hongZhongCard); + //使用实例变量 + setHongZhongCard(param.getInt("card")); + log.info("出牌广播:{}", getHongZhongCard()); log.info("座位号:{}的用户出牌:{}", param.getInt("seat"), param.getInt("card")); } return null; @@ -267,6 +291,10 @@ public class HuNanHongZhong { for (int i = 0; i < cardList.size(); i++) { hongZhongCardInhand.add(cardList.getInt(i)); } + //设置座位号 + setSeat(param.getInt("seat")); + setPlayerId(param.getInt("player")); + if (hongZhongCardInhand.size() > 13) { outCard(client); log.info("机器人:{}为庄家,需要出牌, 牌为:{}", param.getInt("seat"), hongZhongCardInhand.get(0)); @@ -391,7 +419,7 @@ public class HuNanHongZhong { hongZhongSuanFaTest.separateAndAnalyzeHand(hongZhongCardInhand); // 红中麻将出牌 - String hongzhongOutCard = hongZhongSuanFaTest.outCardSuanFa(hongZhongCardInhand, hongZhongCard); + String hongzhongOutCard = hongZhongSuanFaTest.outCardSuanFa(hongZhongCardInhand, getHongZhongCard()); // String hongzhongOutCard = hongZhongSuanFaTest.outCardSuanFa(list, hongZhongCard); ITObject params = TObject.newInstance(); int cardToOut; @@ -456,7 +484,7 @@ public class HuNanHongZhong { log.debug("删除出过的牌组 card: {}", card); log.debug("删除出过的牌组 type: {}", type); log.debug("删除出过的牌组 from_seat: {}", from_seat); - log.debug("机器人 seat: {}", seat); + log.debug("机器人 seat: {}", getSeat()); if (type == 2 || type == 3 || type == 5) { // 碰,杠 getChuGuoCardInhand().remove(Integer.valueOf(card)); diff --git a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/thread/ThreadPoolConfig.java b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/thread/ThreadPoolConfig.java index 4247268..ebc5542 100644 --- a/robots/majiang/robot_mj_hz/src/main/java/robot/mj/thread/ThreadPoolConfig.java +++ b/robots/majiang/robot_mj_hz/src/main/java/robot/mj/thread/ThreadPoolConfig.java @@ -35,7 +35,7 @@ public class ThreadPoolConfig { //添加定时任务线程池 private static final ScheduledExecutorService SCHEDULED_EXECUTOR_SERVICE = - new ScheduledThreadPoolExecutor(2, new ThreadFactory() { + new ScheduledThreadPoolExecutor(10, new ThreadFactory() { private final AtomicInteger threadNumber = new AtomicInteger(1); @Override public Thread newThread(Runnable r) {