其实重连机制并不是多么多高深的技术,其实就是一个在客户端做一个简单的判断,如果连接断了,那么就重新调用连接服务端的代码

当然,我们重连的动作肯定是发生在断连之后发生的,我们可以在上篇的心跳机制的基础上,简单地修改一下客户端的启动代码就可以了:

我们在连接断了之后,我们一般会在finally的方法中去释放资源,这边我们应该不去释放资源,我们在finally里面进行重连:

整个客户端的代码如下:

  1. package com.lyncc.netty.heartbeats;
  2. import java.util.concurrent.TimeUnit;
  3. import io.netty.bootstrap.Bootstrap;
  4. import io.netty.channel.ChannelFuture;
  5. import io.netty.channel.ChannelInitializer;
  6. import io.netty.channel.ChannelOption;
  7. import io.netty.channel.ChannelPipeline;
  8. import io.netty.channel.EventLoopGroup;
  9. import io.netty.channel.nio.NioEventLoopGroup;
  10. import io.netty.channel.socket.SocketChannel;
  11. import io.netty.channel.socket.nio.NioSocketChannel;
  12. import io.netty.handler.codec.string.StringDecoder;
  13. import io.netty.handler.codec.string.StringEncoder;
  14. import io.netty.handler.logging.LogLevel;
  15. import io.netty.handler.logging.LoggingHandler;
  16. import io.netty.handler.timeout.IdleStateHandler;
  17. public class HeartBeatsClient {
  18. public void connect(int port, String host) throws Exception {
  19. // Configure the client.
  20. EventLoopGroup group = new NioEventLoopGroup();
  21. ChannelFuture future = null;
  22. try {
  23. Bootstrap b = new Bootstrap();
  24. b.group(group)
  25. .channel(NioSocketChannel.class)
  26. .option(ChannelOption.TCP_NODELAY, true)
  27. .handler(new LoggingHandler(LogLevel.INFO))
  28. .handler(new ChannelInitializer<SocketChannel>() {
  29. @Override
  30. public void initChannel(SocketChannel ch) throws Exception {
  31. ChannelPipeline p = ch.pipeline();
  32. p.addLast("ping", new IdleStateHandler(0, 4, 0, TimeUnit.SECONDS));
  33. p.addLast("decoder", new StringDecoder());
  34. p.addLast("encoder", new StringEncoder());
  35. p.addLast(new HeartBeatClientHandler());
  36. }
  37. });
  38. future = b.connect(host, port).sync();
  39. future.channel().closeFuture().sync();
  40. } finally {
  41. //          group.shutdownGracefully();
  42. if (null != future) {
  43. if (future.channel() != null && future.channel().isOpen()) {
  44. future.channel().close();
  45. }
  46. }
  47. System.out.println("准备重连");
  48. connect(port, host);
  49. System.out.println("重连成功");
  50. }
  51. }
  52. /**
  53. * @param args
  54. * @throws Exception
  55. */
  56. public static void main(String[] args) throws Exception {
  57. int port = 8080;
  58. if (args != null && args.length > 0) {
  59. try {
  60. port = Integer.valueOf(args[0]);
  61. } catch (NumberFormatException e) {
  62. // 采用默认值
  63. }
  64. }
  65. new HeartBeatsClient().connect(port, "127.0.0.1");
  66. }
  67. }

我们再看看服务器端和客户端启动之后的控制台打印信息:

服务器控制台:

客户端:

好了,这样就可以重连~这只是一个简单的Demo,真实的生产场景用法可能并不是这样

Netty简单的重连机制的更多相关文章

  1. Netty 之 Netty生产级的心跳和重连机制

    https://blog.csdn.net/z69183787/article/details/52625095 最近工作比较忙,但闲暇之余还是看了阿里的冯家春(fengjiachun)的github ...

  2. 基于netty实现的长连接,心跳机制及重连机制

    技术:maven3.0.5 + netty4.1.33 + jdk1.8   概述 Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速 ...

  3. Netty生产级的心跳和重连机制

    今天研究的是,心跳和重连,虽然这次是大神写的代码,但是万变不离其宗,我们先回顾一下Netty应用心跳和重连的整个过程: 1)客户端连接服务端 2)在客户端的的ChannelPipeline中加入一个比 ...

  4. 从零开始实现简单 RPC 框架 9:网络通信之心跳与重连机制

    一.心跳 什么是心跳 在 TPC 中,客户端和服务端建立连接之后,需要定期发送数据包,来通知对方自己还在线,以确保 TPC 连接的有效性.如果一个连接长时间没有心跳,需要及时断开,否则服务端会维护很多 ...

  5. Netty 客户端使用指数退避机制实现重连

    指数退避 可以理解为每次重连失败时,就把重连时间设置为之前的指数级别.例如 2 秒,4 秒,8 秒...... 亚马逊AWS关于指数退避的两篇文章介绍 AWS 中的错误重试和指数退避 Exponent ...

  6. testNG-失败用例重跑机制

    下面简单介绍下testNG的失败重跑的实现方法: 1.首先编写一个类,实现IRetryAnalyzer类,重写其中的retry方法. public class TestNGRetry implemen ...

  7. ARM地址重映射机制

    转:http://blog.csdn.net/yuanzhangmei1/article/details/8395028 ARM体系结构中,系统上电或复位后,处理器将从地址0x0处取第一条指令,因此, ...

  8. 正确理解IM长连接的心跳及重连机制,并动手实现(有完整IM源码)

    1.引言 说道“心跳”这个词大家都不陌生,当然不是指男女之间的心跳,而是和长连接相关的.顾名思义就是证明是否还活着的依据. 什么场景下需要心跳呢?目前我们接触到的大多是一些基于长连接的应用需要心跳来“ ...

  9. Dubbo超时和重连机制

    dubbo启动时默认有重试机制和超时机制.超时机制的规则是如果在一定的时间内,provider没有返回,则认为本次调用失败,重试机制在出现调用失败时,会再次调用.如果在配置的调用次数内都失败,则认为此 ...

随机推荐

  1. 【剑指offer】输入一颗二叉树的根节点,判断是不是平衡二叉树,C++实现

    原创博文,转载请注明出处! # 题目 # 举例 # 思路 由平衡二叉树的定义可知,判断二叉树是否是平衡二叉树的关键在于判断任意结点是否是平衡结点.后序遍历二叉树,判断节点的子树是否平衡并计算节点的子树 ...

  2. 模块(Modules)

    一.引入模块 模块:当编写更大的应用程序时,所有的代码肯定会分成多个文件,这样便于维护,另外已经编写好的函数和对象在被多个程序中使用时,不用把函数和对象拷贝到每个程序中. 模块支持以上功能,在Pyth ...

  3. BZOJ4556 Tjoi2016&Heoi2016 字符串【后缀自动机+倍增+线段树合并】

    Description 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了 一个长为n的字符串s,和m个问题.佳媛姐姐必须正确回答这m个问题,才能打开 ...

  4. 《DSP using MATLAB》示例Example 8.10

    这个例子的代码我不会写,只是放一张书的截图图片在这里.以后再改进吧.

  5. LG3953 逛公园

    题意 策策同学特别喜欢逛公园.公园可以看成一张\(N\)个点\(M\)条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,\(N\)号点是公园的出口,每条边有一个非负权值, 代表策策经过这条 ...

  6. WPF 竖排文字(转)

    ---恢复内容开始--- 想做一个WPF 文字竖排 类似上图.用在TabItem的header上面. <TextBlock FontSize="30" Text=" ...

  7. 最最基本的SQL常用命令

    2015-12-01 18:08:52 1.启动/关闭mysql 开始菜单搜索cmd,右击,以管理员身份运行,输入net start mysql启动mysql,输入net stop mysql关闭my ...

  8. 研究ecmall一些流程、结构笔记 (转)

    index.phpECMall::startup() //ecmall.php object //所有类的基础类 ecmall.phpBaseApp //控制器基础类 app.base.phpECBa ...

  9. 0基础自学php教程

    轻松搞定网页设计之html 一.HTML介绍 1. HTML概念 HTML(Hyper Text Markup Language),即超文本标记语言.是目前网络上应用最为广泛的语言,是构成网页文档的主 ...

  10. GOF23设计模式之原型模式(prototype)

    一.原型模式概述 1.通过new产生一个对象需要非常繁琐的数据准备和访问权限,则可以使用原型模式. 2.就是java中的克隆技术,以某个对象为原型,复制出新的对象,显然,新的对象具备原型对象的特点. ...