Skip to content

CmdPackage包传输协议

zerlenzhang edited this page Mar 5, 2020 · 1 revision

这套框架中,在传输协议(tcp,udp,websocket)之上,还有一层协议就是框架自己维护的CmdPackage包传输协议,所有的消息都被封装成CmdPackage在进行发送和接收

数据结构

CmdPackage { short,short,int,char*}

在lua中意义为{serviceType,cmdType,userTag,body}

  1. serviceType:服务号,网关根据服务号将收到的消息转发给对应的服务器
  2. cmdType:命令号,某一项服务的具体命令
  3. userTag:供用户自定义使用,可以自由写入和读取,一般用于服务器内部标识
  4. body:消息主体,本框架支持protobuf和json

特殊的CmdPackage——RawPackage

  • RawPackage是对CmdPackage的一个简单封装,只多了一个int字段记录body长度,底层也是把RawPackage当作CmdPackage来处理的
  • 使用 Session.SendRawPackage(session,rawpackage) 发送的包,接收CmdPackage的一方也可以收到,反之,使用Session.SendPackage(cmdPackage)发送的包,接收RawPackage的一方也可以收到,因为底层做了简单转化后在调用的Lua回调函数【这并不消耗性能】
  • RawPackage存在的意义是为了网关:网关有时需要也只需要知道包体的包头信息,但常规解析CmdPackage包会解析body,费事而无用,于是设计RawPackage供网关使用

操作RawPackage的API

RawCmd.ReadHeader

  • 读取rawPackage包头信息(只解析前八位)

  • args:

    1. rawPackage:RawPackage

serviceType,cmdType,utag = RawCmd.ReadHeader(rawpackage);//消耗很少,只读取前几个字节

RawCmd.ReadBody

  • 解析读取rawPackage的body部分,并转化为lua表
  • args:
    1. rawPackage:RawPackage body=RawCmd.ReadBody(rawpackage); //这会把body解析出来,消耗大小视包体大小而异

RawCmd.SetUTag

  • 设置包体中的utag

  • args:

    1. rawPackage:RawPackage
    2. value : int RawCmd.SetUTag(rawpackage,value);