|
@@ -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());
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|