使用Netty搭建APP推送服务器

调用时序图如下:

这里写图片描述


源码:https://github.com/Aresyi/pushServer


(1)获取socket登录秘钥(登录口令):key.

key的时效为1分钟,如果客户端在拿到key后,1分钟之内不执行socket登录验证的流程,则key自动生效;

接口服务地址:/user/getPushKey

(2)客户端拿到key后,与服务器端建立socket连接,并立即发送key到服务器。

如果key过期,则服务器会执行下列操作:

a.向客户端发送一个字符:大写的X,

b. 发送成功后,关闭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”:[]中的内容相同;

可以为:C:[]

也可以为:C:{“syscastCount”:[….]}

如果C:{…..}包含内容,内容表示群组里的新消息的个数;

换句话说:C:{…}是A:{…}的一个部分或子集;

(5)服务器端主动返回的消息:

当服务器端收到任何需要实时通知客户端的消息时,服务器端会主动向客户端推送一条socket消息;

消息内容的格式如下:

B:n

n=[1..5] n表示消息的类型,定义如下:

n=1 发送私信

n=2 名片交换请求

n=3 系统消息

n=4 对动态的评论

n=5 对动态的赞

例如:B:1

表示客户端有一条新的私心需要接受;

附:测试用例:

连接测试

(1)获取pushkey后连接socket

(2)pushkey超时后连接socket

(3)错误的pushkey连接socket

(4)网络中断后,提示“网络故障,连接失败”

(5)网络中断,恢复后,socket可以自动连接

(6)切换网络后,socket可以自动连接;

(7)注销->重新登录后,socket可以正确连接

(8)cookie过期后–>自动登录–>连接socket

(9)程序进入后台后,再次回到前台(1分钟内和超过1分钟)

业务测试

(1)发送和接收私信 <–ok

(2)发送名片交换请求 <–ok

(3)接受名片交换请求 <–ok

(4)系统消息 (手工编写的系统消息未测试)

(5)公司群组->加入群组成功后,加入人收到提示;

(6)公司群组->管理员收到加群的提示;

(7)邀请用户完善个人资料 <–ok

(8)对动态写评论 <–ok

(9)对动态写赞 <–ok

(10)对群组里的内容写赞;<–ok

(11)对群组里的内容写评论;<–ok

这里写图片描述

源码:https://github.com/Aresyi/pushServer

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用Netty搭建TCP服务器的示例代码(Hello World): ```java import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; public class HelloWorldServer { private final int port; public HelloWorldServer(int port) { this.port = port; } public void run() throws Exception { // 创建两个 EventLoopGroup,一个用于接收客户端连接,一个用于处理客户端请求 EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { // 创建 ServerBootstrap 对象,用于配置服务器 ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { // 添加消息处理器 ch.pipeline().addLast(new HelloWorldServerHandler()); } }); // 绑定端口,开始接收客户端请求 ChannelFuture f = b.bind(port).sync(); // 等待服务器 socket 关闭 f.channel().closeFuture().sync(); } finally { // 释放资源 workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } public static void main(String[] args) throws Exception { int port = 8080; new HelloWorldServer(port).run(); } } ``` 其中,`HelloWorldServerHandler` 是自定义的消息处理器,可以根据需要进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值