游戏协议传输体系

在游戏开发中使用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 "";
}

posted @ 2018-09-13 20:47  yushim  阅读(42)  评论(0)    收藏  举报