使用Netty搭建APP推送服务器
调用时序图如下:

源码:https://github.com/Aresyi/pushServer
1. 获取socket登录秘钥(登录口令):key.
key的时效为1分钟,如果客户端在拿到key后,1分钟之内不执行socket登录验证的流程,则key自动生效;接口服务地址:/user/getPushKey
2. 客户端拿到key后,与服务器端建立socket连接,并立即发送key到服务器。如果key过期,则服务器会执行下列操作:
- 向客户端发送一个字符:大写的X,
- 发送成功后,关闭socket连接;
- 发送key的格式如下:用户ID=密钥,如123=abcdef, 如果key不正确,则服务器端会直接关闭连接,不向客户端返回任何内容;
3. key验证成功后,服务器会立即返回初次心跳消息;初次心跳消息的格式如下:
A:{“Result”:{“sysNotifyCount”:1,”applyCount”:106,”messageCount”:0,”commentCount”:0,”praiseCount”:0,”sysCastCount”:[]}}
注:(与V1.210及以前的版本的消息格式相同)
4. 心跳:
- 服务器端会每隔一段指定的时间(5分钟)向客户端发送一个心跳消息,用于判断客户端是否在线;
- 服务器发送的心跳消息的内容为:”\r\n”,客户端收到心跳后,也同样向服务器端返回字符“1”
- 服务器端返回的心跳包的内容格式如下:C:jsonStr.其中,jsonStr的内容与A:{…}中,”sysCastCount”:[]中的内容相同;
a. 可以为:C:[]
b. 也可以为:C:{“syscastCount”:[….]}
c. 如果C:{…..}包含内容,内容表示群组里的新消息的个数;
d. 换句话说:C:{…}是A:{…}的一个部分或子集;
5. 服务器端主动返回的消息:当服务器端收到任何需要实时通知客户端的消息时,服务器端会主动向客户端推送一条socket消息;消息内容的格式如下:B:n,n=[1..5] n表示消息的类型,定义如下:
- n=1 发送私信
- n=2 名片交换请求
- n=3 系统消息
- n=4 对动态的评论
- n=5 对动态的赞
例如:B:1, 表示客户端有一条新的私心需要接受;
附:测试用例:
连接测试
- 获取pushkey后连接socket
- pushkey超时后连接socket
- 错误的pushkey连接socket
- 网络中断后,提示“网络故障,连接失败”
- 网络中断,恢复后,socket可以自动连接
- 切换网络后,socket可以自动连接;
- 注销->重新登录后,socket可以正确连接
- cookie过期后–>自动登录–>连接socket
- 程序进入后台后,再次回到前台(1分钟内和超过1分钟)
业务测试
- 发送和接收私信 <–ok
- 发送名片交换请求 <–ok
- 接受名片交换请求 <–ok
- 系统消息 (手工编写的系统消息未测试)
- 公司群组->加入群组成功后,加入人收到提示;
- 公司群组->管理员收到加群的提示;
- 邀请用户完善个人资料 <–ok
- 对动态写评论 <–ok
- 对动态写赞 <–ok
- 对群组里的内容写赞;<–ok
- 对群组里的内容写评论;<–ok