golang实现的长连接服务,适合基于房间的聊天推送场景
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
}