Netty Client 重连实现

2023-11-11

当我们用Netty实现一个TCP client时,我们当然希望当连接断掉的时候Netty能够自动重连。
Netty Client有两种情况下需要重连:

  1. Netty Client启动的时候需要重连
  2. 在程序运行中连接断掉需要重连。

对于第一种情况,Netty的作者在stackoverflow上给出了解决方案
对于第二种情况,Netty的例子uptime中实现了一种解决方案

而Thomas在他的文章中提供了这两种方式的实现的例子。

实现ChannelFutureListener 用来启动时监测是否连接成功,不成功的话重试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public  class  Client 
 
    private  EventLoopGroup loop =  new  NioEventLoopGroup(); 
    public  static  void  main( String[] args ) 
   
      new  Client().run(); 
   
    public  Bootstrap createBootstrap(Bootstrap bootstrap, EventLoopGroup eventLoop) {  
      if  (bootstrap !=  null ) { 
        final  MyInboundHandler handler =  new  MyInboundHandler( this ); 
        bootstrap.group(eventLoop); 
        bootstrap.channel(NioSocketChannel. class ); 
        bootstrap.option(ChannelOption.SO_KEEPALIVE,  true ); 
        bootstrap.handler( new  ChannelInitializer<SocketChannel>() { 
          @Override 
          protected  void  initChannel(SocketChannel socketChannel)  throws  Exception { 
            socketChannel.pipeline().addLast(handler); 
         
        }); 
        bootstrap.remoteAddress( "localhost" 8888 );
        bootstrap.connect().addListener( new  ConnectionListener( this ));
     
      return  bootstrap; 
   
    public  void  run() { 
      createBootstrap( new  Bootstrap(), loop);
   
  }

ConnectionListener 负责重连:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public  class  ConnectionListener  implements  ChannelFutureListener { 
   private  Client client; 
   public  ConnectionListener(Client client) { 
     this .client = client; 
  
   @Override 
   public  void  operationComplete(ChannelFuture channelFuture)  throws  Exception {  
     if  (!channelFuture.isSuccess()) { 
       System.out.println( "Reconnect" ); 
       final  EventLoop loop = channelFuture.channel().eventLoop(); 
       loop.schedule( new  Runnable() { 
         @Override 
         public  void  run() { 
           client.createBootstrap( new  Bootstrap(), loop); 
        
       }, 1L, TimeUnit.SECONDS); 
    
  
}

同样在ChannelHandler监测连接是否断掉,断掉的话也要重连:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public  class  MyInboundHandler  extends  SimpleChannelInboundHandler { 
    private  Client client; 
    public  MyInboundHandler(Client client) { 
      this .client = client; 
   
    @Override 
    public  void  channelInactive(ChannelHandlerContext ctx)  throws  Exception {  
      final  EventLoop eventLoop = ctx.channel().eventLoop(); 
      eventLoop.schedule( new  Runnable() { 
        @Override 
        public  void  run() { 
          client.createBootstrap( new  Bootstrap(), eventLoop); 
       
      }, 1L, TimeUnit.SECONDS); 
      super .channelInactive(ctx); 
   
  }

参考文档

  • http://stackoverflow.com/questions/19739054/whats-the-best-way-to-reconnect-after-connection-closed-in-netty
  • https://github.com/netty/netty/blob/master/example/src/main/java/io/netty/example/uptime/UptimeClientHandler.java
  • http://tterm.blogspot.jp/2014/03/netty-tcp-client-with-reconnect-handling.html
  • ctx.close vs ctx.channel().close
  • ctx.write vs ctx.channel().write

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Netty Client 重连实现 的相关文章

随机推荐

  • html文件存储服务,HTML5中五种存储方式的介绍

    本篇文章给大家带来的内容是关于HTML5中五种存储方式的介绍 有一定的参考价值 有需要的朋友可以参考一下 希望对你有所帮助 h5之前 存储主要是用cookies cookies缺点有在请求头上带着数据 大小是4k之内 主Domain污染 主
  • pandas.DataFrame.groupby 按某列类型值将文件分为多个文件

    1 groupby pandas DataFrame groupby groupby函数使用映射器或一系列列对数据帧进行分组 groupby操作涉及拆分对象 应用函数和组合结果的某种组合 这可以用于对大量数据进行分组 并对这些分组进行计算操
  • 若依开发时指定el-dialog局部显示的方法

    第一步 实例化一个 el dialog 最外面的div就是ei dialog要显示的位置 div div
  • ajax、axios、fetch之间的区别与联系

    整理ajax axios fetch优缺点 简单总结 JavaScript是一门前端语言 AJAX是一门技术 它提供了异步更新的机制 使客户端与服务器间交换数据而非整个页面文档 实现页面的局部更新 jQuery是一个框架 它对JavaScr
  • React - 路由 lazyLoad 的使用(路由懒加载)

    React 路由 lazyLoad 路由懒加载 lazy是React提供的懒 动态 加载组件的方法 React lazy 路由组件代码会被分开打包 能减少打包体积 延迟加载首屏不需要渲染的组件 依赖内置组件Suspense标签的fallba
  • scau oj 10848 2021-11-06

    18048 自由落体 时间限制 1000MS 代码长度限制 10KB 提交次数 0 通过次数 0 题型 编程题 语言 G GCC VC Description 一个球从100米的高度自由落下 每次落地后弹起的原来高度的一半 计算并输出第n次
  • 海思3861环境搭建

    开发环境 ubuntu18 04 DOPI3861开发板 Q群 735884031 一 安装编译工具 1 按照官方文档下载编译工具并添加到环境变量中 https device harmonyos com cn docs start intr
  • spring boot logback 配置

    为什么要使用logback 在开发中不建议使用System out因为大量的使用会增加资源的消耗 因为使用System out是在当前线程执行的 写入文件也是写入完毕之后才继续执行下面的程序 而使用Log工具不但可以控制日志是否输出 怎么输
  • git 合并不提交

    1 默认情况 默认合并 会执行commit 查看日志信息会有commit日志 2 合并不提交 勾选下面两个复选框 查看日志时 就不会有默认提交了 执行提交命令时 就会出现合并后的文件
  • Acwing 3. 完全背包问题

    暴力解法 完全背包每种物品都有无限个可用 include
  • elementui表格自定义表头的两种方法

    表格自定义表头的方式 多选框表头换文字 请查看上篇博客 http t csdn cn 69De2 文字换按钮 render header render header方法详情 Table column Attributes 参数 说明 类型
  • 时序预测

    MATLAB实现贝叶斯优化CNN GRU时间序列预测 股票价格预测 目录 MATLAB实现贝叶斯优化CNN GRU时间序列预测 股票价格预测 效果一览 基本介绍 模型搭建 程序设计 学习总结 往期精彩 参考资料 效果一览 基本介绍 MATL
  • 苹果系统itunes连iphone连不上服务器,iphone连不上itunes怎么办,iphone连不上itunes的解决办法...

    iPhone连不上iTunes怎么办 苹果手机连接不上iTunes的解决方法 iPhone手机虽然比较贵 但是使用的人也不少 作为一款区别于安卓系统的手机 它拥有更流畅的系统和更好的体验 但是有些果粉平时在操作手机时 有时需要通过连接itu
  • java/php/net/python网上订餐系统设计

    本系统带文档lw万字以上 答辩PPT 查重 如果这个题目不合适 可以去我上传的资源里面找题目 找不到的话 评论留下题目 或者站内私信我 有时间看到机会给您发 系统体系结构 网上订餐系统的结构图4 1所示 图4 1 系统结构 登录系统结构图
  • HashMap的扩容机制

    目录 一 HashMap的底层 二 HashMap的扩容机制原理 1 JDK1 7版本扩容 2 JDK1 8版本扩容 三 HashMap底层JDK1 7到JDK1 8的变化 一 HashMap的底层 底层 采用数组 链表 JDK1 7 采用
  • slam十四讲 _直接法

    视觉里程计 直接法是视觉里程计另一主要分支 它与特征点法有很大不同 虽然它还没有成为现 在 VO 中的主流 但经过近几年的发展 直接法在一定程度上已经能和特征点法平分秋色 特征点法的缺点 关键点的提取与描述子的计算非常耗时 使用特征点时 忽
  • 有序统计恒虚警检测(OS-CFAR)算法的MATLAB代码

    有序统计恒虚警检测 OS CFAR 算法的MATLAB代码 有序统计恒虚警检测 Ordered Statistic Constant False Alarm Rate OS CFAR 是一种常用的雷达信号处理算法 用于检测雷达回波中的目标信
  • TencentOS-tiny 任务间通信(八)- 消息队列

    一 任务间通信 消息队列 概述 消息队列提供了任务间传递指针数据的机制 所谓的 消息 就是指针 消息本身如何解析使用 由传递消息的两个任务自行规定 消息队列不对消息本身做任何规定和限制 消息队列仅承担指针数据的传递义务 API讲解 编程实例
  • uniapp截取数组中的前几项

  • Netty Client 重连实现

    当我们用Netty实现一个TCP client时 我们当然希望当连接断掉的时候Netty能够自动重连 Netty Client有两种情况下需要重连 Netty Client启动的时候需要重连 在程序运行中连接断掉需要重连 对于第一种情况 N