Sbyte+Length+Cmd+Subcmd+UidLen+Uid+SidLen+Sid+RidLen+Rid+BodyLen+Body+ExtLen+Ext+Ebyte Sbyte: 1个字节,固定值:0xfa,标识数据包开始 Length: 2个字节(网络字节序),包括自身在内整个数据包的长度 Cmd: 1个字节, * 0x01:心跳包 * 0x02:加入房间 * 0x03:退出房间 * 0x04:上行消息 * 0x05:拉取消息列表 * 0x06:推送消息  * 0xff:标识服务异常 Subcmd: 1个字节,路由不同的后端接口,见conf/conf.json pubs和msgs节点,  * pubs代表上行消息配置,中转给业务方数据示例如下:uid=u1&sid=s1&rid=r1&cmd=4&subcmd=1&body=xxx,直接把后端返回作为body内容传回给client  * msgs代表拉消息列表配置,中转给业务方数据示例如下:uid=u1&sid=s1&rid=r1&cmd=5&subcmd=1,返回给client的body内容示例如下:{"1":["hello world"]} UidLen: 1个字节,代表Uid长度 Uid: 用户id,对于app,可以是设备id,对于浏览器,可以是登陆用户id SidLen: 1个字节,代表Sid长度 Sid: session_id,区分同一uid不同连接,对于浏览器,可以是生成的随机串,浏览器多窗口,多标签需单独生成随机串 RidLen: 1个字节,代表Rid长度 Rid: 房间id BodyLen: 2个字节(网络字节序),代表Body长度 Body: 和业务方对接,connsvr会中转给业务方 ExtLen: 2个字节(网络字节序),代表Ext长度 Ext: 扩展字段: 1. 当来自于connsvr时,目前支持如下: { "PushKind": 1 // 1: 推送通知,然后客户端主动拉后端服务 2: 推送整条消息,客户端不用拉(默认) 3: 推送通知,然后客户端来connsvr拉消息 } 2. 当来自于client时,目前支持如下: { "Cookie": "xx=x;yy=y" // 传入client的cookie值 } Ebyte: 1个字节,固定值:0xfb,标识数据包结束 注1:当connsvr服务处理异常,比如调用后端服务失败,返回给client的数据包,Cmd:0xff 注2:当Cmd为0x05时,客户端到connsvr拉取消息列表,当connsvr消息为空时,connsvr为根据conf/conf.json msgs节点配置路由到后端服务拉取消息列表,body支持如下: { MsgIds map[byte]string // 混合业务命令字, key: subcmd, value: msgid } 注3:当Cmd为0x02时,如果服务端有用户未读消息,并且传入合适的body,立马返回消息列表, body支持如下: { MsgIds map[byte]string // 混合业务命令字, key: subcmd, value: msgid }