游戏协议传输体系
在游戏开发中使用protobuf协议来传输数据,使用到extensions(extend)来定义拓展协议,本例中使用协议名称为Request,其他协议拓展Request。下面列出部分重要代码。
1、protobuf协议定义
//总请求
message Request {
extensions 100 to max;
required RequestType requestType = 1; //请求类型
optional string md5 = 2;
optional int32 seq = 3;
optional int64 session_id = 4;
optional int32 logic_id = 5; //逻辑服id标识,逻辑服与转发服通信
optional int32 prox_id = 6; //转发服id标识,转发与逻辑服通信
optional int64 prox_seesion_id = 7; //在代理服的session_id
}
enum RequestType {
HEAR = 1;
LOING = 2; //登录(loginRequest)
REGISTER = 3; //注册()
PROXY = 4; //逻辑到转发的总请求(response)
ROOM = 5; //房间请求(roomRequest)
LOGIC_ROOM = 6; //逻辑服房间请求
MY_TEST = 7; //我的压力测试(myTestRequest)
OTHER_SYS = 8; //其它系统功能(otherSystemRequest)
STORE = 9; //商城(storeRequest)
GOLD_CARD = 10; //房卡相关(goldCardRequest)
MONEY_GAME = 11; //金币场(MoneyGameRequest)
ACTIVITY = 12; //精彩活动(ActivityRequest)
SUBAPP_UPDATE = 13; //子游戏更新请求 ( SubAppUpdateRequest )
RANK = 14; //排行榜(RankRequest)
SIGNATURE = 15; //签名设置(SignatureRequest)
PLAYER_VIEW = 16; //查看其他玩家信息
PROPERTY = 17; //通用属性值请求(AccountPropertyRequest)
S2S = 18; //服务器用
CLUB = 19; //俱乐部
C2S = 20; //客户端与服务器通信,拆包(公用CommonProto)
}
extend Request {
optional HeartRequest heartRequest = 100;
optional LoginRequest loginRequest = 101;
optional Response response = 102;
optional RoomRequest roomRequest = 103;
optional LogicRoomRequest logicRoomRequest = 104;
optional S2SCommonProto s2sRequest = 116;
optional ClubRequest clubRequest = 117;
optional CommonProto c2sRequest = 118;
}
以上就是Request数据包结构,用于发送请求:客户端—游戏服务器、服务器-服务器,具体对应协议的详细结构不再一一列举,服务端向客户端发送数据类似,不做具体介绍。
2、游戏中代码解析,使用Netty框架
// 用于获取Request协议
@Override
protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
if (msg instanceof Request) {
Request request = (Request) msg;
} else {
logger.error("client->proxy,消息包不是Request类型 ");
}
}
以上可以获取到Request协议,通过解析Request获取具体的子协议。具体方法使用java注解加反射的方法是得对应的协议号和协议一一对应,具体如下:
@ICmd(code = RequestType.C2S_VALUE, exName = "c2sRequest")
public class C2SCommomHandler extends IClientHandler(CommonProto) {
@Override
protected void execute(CommonProto commProto, Request topRequest, C2SSession session) throws Exception {
}
}
/**
* 用于注解请求处理器
* @author wu_hc
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ICmd {
/**
* 协议号
* @return
*/
int code();
/**
* protobuf 字段拓展名称
*/
String exName() default "";
/**
* 如果不是在代理服处理,需要特别指定
*/
EServerType msgType() default EServerType.PROXY;
/**
* @return
*/
String desc() default "";
}

浙公网安备 33010602011771号