Browse Source

优化代码

johnclot69 4 months ago
parent
commit
86ef9aa226

+ 33 - 33
incubator-center/src/main/java/com/incubator/center/listener/CenterInnerListener.java

@@ -8,6 +8,7 @@ import com.incubator.core.net.ws.WSRequest;
 import com.incubator.core.net.ws.WSResponse;
 import com.incubator.core.net.handler.listener.GameServerConnectionListener;
 import com.incubator.center.manager.GameManager;
+import com.incubator.message.proto.CommonProto;
 import io.netty.buffer.ByteBuf;
 import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame;
 import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
@@ -20,8 +21,9 @@ public class CenterInnerListener extends GameServerConnectionListener {
 	public void connectionOpened(Connection connection) {
 		HeartConfig heart = new HeartConfig();
 		connection.setAttribute(HeartConfig, heart);
-		setHeartEnable(false);//关闭心跳
-		logger.info("链路打开:" + connection);
+		//关闭心跳
+		setHeartEnable(false);
+        logger.info("链路打开 : {}", connection);
 	}
 
 	@Override
@@ -39,50 +41,48 @@ public class CenterInnerListener extends GameServerConnectionListener {
 
 	@Override
 	public void messageArrived(Connection conn, Object msg) {
-		try {
-			if (msg instanceof ByteBuf) {
-				ByteBuf byteBuf = (ByteBuf) msg;
+		if (msg instanceof ByteBuf) {
+			ByteBuf byteBuf = (ByteBuf) msg;
 
+			try {
 				byte[] bytes = new byte[byteBuf.readableBytes()];
 				byteBuf.readBytes(bytes);
-
+				// 提取请求数据
 				WSRequest request = new WSRequest(bytes);
-
-				NetHandler handler = GCenter.getHandler(request.getCmd());
-				if (handler != null) {
-					logger.info("收到消息 : cmd={}, 请求内容 : {}", request.getCmd(), request.toJson());
-					WSResponse response = new WSResponse();
-					handler.onDate(conn, request, response);
-					conn.writeAndFlush(response.toBytes());
-					logger.info("返回消息 : cmd={}, 返回内容 : {}", request.getCmd(), response.toJson());
-				} else {
+				// 获取处理器
+				NetHandler handler = GCenter.handlers.get(request.getCmd());
+				if (handler == null) {
 					logger.info("消息号错误... cmd={}", request.getCmd());
 					conn.close();
+					return;
 				}
+				// 处理消息
+				logger.info("收到消息 : cmd={}, 请求内容 : {}", request.getCmd(), request.toJson());
+				WSResponse response = new WSResponse();
+				handler.onDate(conn, request, response);
+				logger.info("返回消息 : cmd={}, 返回内容 : {}", request.getCmd(), response.toJson());
+			} catch (Exception e) {
+				logger.error("处理消息时发生错误 : ", e);
+				conn.close();
+			} finally {
+				// 释放 ByteBuf 资源
+				byteBuf.release();
 			}
-		} catch (Exception e) {
-			logger.error("...数据解析有错...", e);
-			conn.close();
 		}
 	}
 
 	@Override
 	public boolean doIsHeartReq(Object msg) {
-//		try {
-//			byte[] bytes = new byte[msg.content().readableBytes()];
-//			msg.content().readBytes(bytes);
-//			MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(bytes);
-//			WSRequest request = super.parseWSRequest(unpacker);
-//			return request.getMsgId() == ProtoCommon.MsgId.S2C_Heartbeat_VALUE;
-//		} catch (Exception e) {
-//			logger.error("心跳请求解析失败", e);
-//			return false;
-//		}
-
-		return false;
-
-//		WSRequest request = JSONObject.parseObject(msg.text(), WSRequest.class);
-//		return request.getMsgId() == ProtoCommon.MsgId.S2C_Heartbeat_VALUE;
+		try {
+			ByteBuf byteBuf = (ByteBuf) msg;
+			byte[] bytes = new byte[byteBuf.readableBytes()];
+			byteBuf.readBytes(bytes);
+			WSRequest request = new WSRequest(bytes);
+			return request.getCmd() == CommonProto.Cmd.S2S_GAME_REG_VALUE;
+		} catch (Exception e) {
+			logger.error("心跳请求解析失败", e);
+			return false;
+		}
 	}
 
 	@Override

+ 27 - 21
incubator-game/src/main/java/com/incubator/game/listener/CenterClientListener.java

@@ -39,28 +39,34 @@ public class CenterClientListener extends GameClientConnectionListener {
 
 	@Override
 	public void messageArrived(Connection conn, Object msg) {
-		try {
-			if (msg instanceof ByteBuf) {
-				ByteBuf byteBuf = (ByteBuf) msg;
-
-				byte[] bytes = new byte[byteBuf.readableBytes()];
-				byteBuf.readBytes(bytes);
-
-				WSRequest request = new WSRequest(bytes);
-
-				NetHandler handler = GGame.handlers.get(request.getCmd());
-				if (handler != null) {
-					logger.info("收到消息 : cmd={}, 请求内容 : {}", request.getCmd(), request.toJson());
-					WSResponse response = new WSResponse();
-					handler.onDate(conn, request, response);
-					logger.info("返回消息 : cmd={}, 返回内容 : {}", request.getCmd(), response.toJson());
-				} else {
+		if (msg instanceof ByteBuf) {
+			ByteBuf byteBuf = (ByteBuf) msg;
+
+            try {
+                byte[] bytes = new byte[byteBuf.readableBytes()];
+                byteBuf.readBytes(bytes);
+				// 提取请求数据
+                WSRequest request = new WSRequest(bytes);
+				// 获取处理器
+                NetHandler handler = GGame.handlers.get(request.getCmd());
+                if (handler == null) {
 					logger.info("消息号错误... cmd={}", request.getCmd());
-				}
-			}
-		} catch (Exception e) {
-			logger.error("...数据解析有错...");
-		}
+					conn.close();
+					return;
+                }
+				// 处理消息
+				logger.info("收到消息 : cmd={}, 请求内容 : {}", request.getCmd(), request.toJson());
+				WSResponse response = new WSResponse();
+				handler.onDate(conn, request, response);
+				logger.info("返回消息 : cmd={}, 返回内容 : {}", request.getCmd(), response.toJson());
+            } catch (Exception e) {
+				logger.error("处理消息时发生错误 : ", e);
+				conn.close();
+            } finally {
+				// 释放 ByteBuf 资源
+				byteBuf.release();
+            }
+        }
 	}
 
 	@Override

+ 56 - 40
incubator-game/src/main/java/com/incubator/game/listener/PublicListener.java

@@ -10,6 +10,9 @@ import com.incubator.core.net.handler.listener.GameServerConnectionListener;
 import com.incubator.message.proto.CommonProto;
 import io.netty.buffer.ByteBuf;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * 公共接口
  * 
@@ -24,7 +27,9 @@ public class PublicListener extends GameServerConnectionListener {
 		connection.setAttribute(HeartConfig, heart);
 		setHeartEnable(GGame.heartEnable);
 		GGame.publicClients.add(connection);
-		connection.setAttribute(LastReadTimeMills, System.currentTimeMillis()); // 设置最后心跳时间
+		// 设置最后心跳时间
+		connection.setAttribute(LastReadTimeMills, System.currentTimeMillis());
+		logger.info("链路打开 : {}", connection);
 	}
 
 	@Override
@@ -47,43 +52,49 @@ public class PublicListener extends GameServerConnectionListener {
 
 	@Override
 	public void messageArrived(Connection conn, Object msg) {
-		try {
-			if (msg instanceof ByteBuf) {
-				ByteBuf byteBuf = (ByteBuf) msg;
-
-//				conn.setAttribute(LastReadTimeMills, System.currentTimeMillis());// 设置最后心跳时间
-//				resetHeartSeq(conn);// 设置心跳
-//				if (isHeartReq(msg)) {
-//					sendHeartRsp(conn);
-//					return;
-//				}
-
-				byte[] bytes = new byte[byteBuf.readableBytes()];
-				byteBuf.readBytes(bytes);
-
-				WSRequest request = new WSRequest(bytes);
+		if (msg instanceof ByteBuf) {
+			ByteBuf byteBuf = (ByteBuf) msg;
 
-				NetHandler handler = GGame.handlers.get(request.getCmd());
-				if (handler != null) {
-					// 过滤一下心跳消息
-					if (request.getCmd() != CommonProto.Cmd.HeartBeatReq_VALUE) {
-						logger.info("收到消息 : cmd={}, 请求内容 : {}", request.getCmd(), request.toJson());
-					}
-					WSResponse response = new WSResponse();
-					handler.onDate(conn, request, response);
-					conn.writeAndFlush(response.toBytes());
-					if (request.getCmd() != CommonProto.Cmd.HeartBeatReq_VALUE) {
-						logger.info("返回消息 : cmd={}, 返回内容 : {}", request.getCmd(), response.toJson());
-					}
-				} else {
+            try {
+                byte[] bytes = new byte[byteBuf.readableBytes()];
+                byteBuf.readBytes(bytes);
+				// 提取请求数据
+                WSRequest request = new WSRequest(bytes);
+				// 获取处理器
+                NetHandler handler = GGame.handlers.get(request.getCmd());
+                if (handler == null) {
 					logger.error("消息号错误... cmd={}", request.getCmd());
 					conn.close();
+					return;
+                }
+				// 心跳消息特殊处理
+				if (request.getCmd() == CommonProto.Cmd.HeartBeatReq_VALUE) {
+					this.processHeartbeat(conn);
+					return;
 				}
-			}
-		} catch (Exception e) {
-			logger.error("...数据解析有错...", e);
-			conn.close();
-		}
+				// 处理非心跳消息
+				logger.info("收到消息 : cmd={}, 请求内容 : {}", request.getCmd(), request.toJson());
+				WSResponse response = new WSResponse();
+				handler.onDate(conn, request, response);
+				conn.writeAndFlush(response.toBytes());
+				logger.info("返回消息 : cmd={}, 返回内容 : {}", request.getCmd(), response.toJson());
+			} catch (Exception e) {
+				logger.error("处理消息时发生错误 : ", e);
+				conn.close();
+            } finally {
+				// 释放 ByteBuf 资源
+				byteBuf.release();
+            }
+        }
+	}
+
+	private void processHeartbeat(Connection conn) throws Exception {
+		// 设置最后心跳时间
+		conn.setAttribute("LastReadTimeMillis", System.currentTimeMillis());
+		// 设置心跳
+		resetHeartSeq(conn);
+		// 发送心跳响应
+		this.doSendHeartRsp(conn);
 	}
 
 	@Override
@@ -92,8 +103,6 @@ public class PublicListener extends GameServerConnectionListener {
 			ByteBuf byteBuf = (ByteBuf) msg;
 			byte[] bytes = new byte[byteBuf.readableBytes()];
 			byteBuf.readBytes(bytes);
-//			MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(bytes);
-//			WSRequest request = super.parseWSRequest(unpacker);
 			WSRequest request = new WSRequest(bytes);
 			return request.getCmd() == CommonProto.Cmd.HeartBeatReq_VALUE;
 		} catch (Exception e) {
@@ -118,7 +127,7 @@ public class PublicListener extends GameServerConnectionListener {
 //                conn.writeAndFlush(super.packMessage(msg));
             }
         } catch (Exception e) {
-			logger.info("发送心跳请求出错:" + conn.getUid() + e.getMessage());
+            logger.info("发送心跳请求出错:{}, {}", conn.getUid(), e.getMessage());
         }
 
         // {//借助心跳完成一些任务
@@ -129,7 +138,14 @@ public class PublicListener extends GameServerConnectionListener {
 	}
 
 	@Override
-	public void doSendHeartRsp(Connection connection) {// 发送心跳回复
-		 logger.info("=============我收到了:" + connection.getPlayerId());
-	}
+	public void doSendHeartRsp(Connection connection) {
+		// 发送心跳回复
+        try {
+            Map<String, Object> data = new HashMap<>();
+            data.put("currentTimeMillis", System.currentTimeMillis());
+            connection.writeAndFlush(new WSResponse(CommonProto.Cmd.HeartBeatRes, data).toBytes());
+        } catch (Exception e) {
+            logger.info("发送心跳回复出错:{}, {}", connection.getUid(), e.getMessage());
+        }
+    }
 }