当前位置:   article > 正文

Netty在Android开发中的应用实战系列(三)——— 心跳处理, 断线重连

channelinactive usereventtriggered

本文来自阿钟的投稿,阅读大约10分钟

一、客户端添加心跳处理

这里就需要提到一个netty重要的IdleStateHandler,用于处理心跳机制;为当前连接通道设置 读、写、读写 空闲超时时间,当达到了设定的时间那么就会回调ClientHandler中的userEventTriggered(ChannelHandlerContext ctx, Object evt)函数。
这里在解释一下什么叫空闲超时:假设你设置了客户端读超时为10s,如果持续10s内客户端没有收到数据(也就是服务端没有发送数据过来)那么就会回调userEventTriggered函数,如果有一直收到数据那么就不会回调userEventTriggered函数;直到持续10s没有收到数据则继续触发userEventTriggered函数。

  • IdleStateHandler()常用的构造函数,三个参数的释义

  1. 1public IdleStateHandler(int readerIdleTimeSeconds, int writerIdleTimeSeconds, int allIdleTimeSeconds) {
  2. 2        this((long)readerIdleTimeSeconds, (long)writerIdleTimeSeconds, (long)allIdleTimeSeconds, TimeUnit.SECONDS);
  3. 3    }
  • readerIdleTimeSeconds        空闲读的时长

  • writerIdleTimeSeconds       空闲写的时长

  • writerIdleTimeSeconds       空闲读写的时长

IdleStateHandler的使用

  • 与之前添加编解码器一样,往ChannelPipeline添加即可

  1. 1NioEventLoopGroup group = new NioEventLoopGroup();
  2. 2Bootstrap bootstrap = new Bootstrap()
  3. 3        // 省略部分代码
  4. 4        .handler(new ChannelInitializer<SocketChannel>() {
  5. 5            @Override
  6. 6            protected void initChannel(SocketChannel socketChannel) throws Exception {
  7. 7                ChannelPipeline pipeline = socketChannel.pipeline();
  8. 8                //添加心跳处理Handler
  9. 9                pipeline.addLast(new IdleStateHandler(1000));
  10. 10                //省略部分代码
  11. 11            }
  12. 12        });
  13. 13// 连接到服务端
  14. 14ChannelFuture channelFuture = bootstrap.connect(new InetSocketAddress(IP, PORT));
  • ClientHandler中进行心跳数据包发送

  1. 1@Override
  2. 2public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
  3. 3    super.userEventTriggered(ctx, evt);
  4. 4    if (evt instanceof IdleStateEvent) {
  5. 5        if (((IdleStateEvent) evt).state() == IdleState.READER_IDLE) {
  6. 6            sendHeartPkg(ctx);
  7. 7        }
  8. 8    } else {
  9. 9        super.userEventTriggered(ctx, evt);
  10. 10    }
  11. 11}
  12. 12/**
  13. 13 * 发送心跳
  14. 14 */
  15. 15private void sendHeartPkg(ChannelHandlerContext ctx) {
  16. 16    PkgDataBean bean = new PkgDataBean();
  17. 17    bean.setCmd((byte0x02);
  18. 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/242184
推荐阅读
相关标签
  

闽ICP备14008679号