Netty断线重连

最近使用Netty开发一个中转服务,需要一直保持与Server端的连接,网络中断后需要可以自动重连,查询官网资料,实现方案很简单,核心思想是在channelUnregistered钩子函数里执行重连。

创建连接

需要把configureBootstrap重构为一个函数,方便后续复用

  1. EventLoopGroup group = new NioEventLoopGroup(); 

  2. private volatile Bootstrap bootstrap; 


  3. public void init(String host, int port) throws RobotException { 

  4. this.serverIp = host; 

  5. this.serverPort = port; 

  6. try { 

  7. // 创建并初始化 Netty 客户端 Bootstrap 对象 

  8. bootstrap = configureBootstrap(new Bootstrap(),group); 

  9. bootstrap.option(ChannelOption.TCP_NODELAY, true); 

  10. doConnect(bootstrap); 



  11. catch(Exception ex){ 

  12. ex.printStackTrace(); 

  13. throw new RobotException("connect remote control server error!",ex.getCause()); 






  14. Bootstrap configureBootstrap(Bootstrap b, EventLoopGroup g) { 

  15. b.group(g).channel(NioSocketChannel.class) 

  16. .remoteAddress(serverIp, serverPort) 

  17. .handler(new ChannelInitializer<SocketChannel>() { 

  18. @Override 

  19. public void initChannel(SocketChannel channel) throws Exception { 

  20. ChannelPipeline pipeline = channel.pipeline(); 

  21. // 编解码器 

  22. pipeline.addLast(protoCodec); 

  23. // 请求处理 

  24. pipeline.addLast(RobotClient.this); 



  25. }); 


  26. return b; 




  27. void doConnect(Bootstrap b) { 

  28. try { 


  29. ChannelFuture future = b.connect(); 

  30. future.addListener(new ChannelFutureListener() { 

  31. @Override 

  32. public void operationComplete(ChannelFuture future) throws Exception { 

  33. if (future.isSuccess()) { 

  34. System.out.println("Started Tcp Client: " + serverIp); 

  35. } else { 

  36. System.out.println("Started Tcp Client Failed: "); 



  37. if (future.cause() != null) { 

  38. future.cause().printStackTrace(); 






  39. }); 

  40. } catch (Exception e) { 

  41. e.printStackTrace(); 





断线重连

来看断线重连的关键代码:

  1. @ChannelHandler.Sharable 

  2. public class RobotClient extends SimpleChannelInboundHandler<RobotProto> { 

  3. @Override 

  4. public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { 

  5. // 状态重置 

  6. isConnected = false; 

  7. this.serverStatus = -1; 


  8. final EventLoop loop = ctx.channel().eventLoop(); 

  9. loop.schedule(new Runnable() { 

  10. @Override 

  11. public void run() { 

  12. doConnect(configureBootstrap(new Bootstrap(), loop)); 



  13. }, 1, TimeUnit.SECONDS); 





需要注意,Client类需要添加@ChannelHandler.Sharable注解,否则重连时会报错


作者:Jadepeng
出处:jqpeng的技术记事本--http://www.cnblogs.com/xiaoqi
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Netty断线重连的更多相关文章

  1. Netty 断线重连解决方案

    http://www.spring4all.com/article/889 本篇文章是Netty专题的第七篇,前面六篇文章如下: 高性能NIO框架Netty入门篇 高性能NIO框架Netty-对象传输 ...

  2. Netty学习篇④-心跳机制及断线重连

    心跳检测 前言 客户端和服务端的连接属于socket连接,也属于长连接,往往会存在客户端在连接了服务端之后就没有任何操作了,但还是占用了一个连接:当越来越多类似的客户端出现就会浪费很多连接,netty ...

  3. Netty 客户端断线重连

    client 关闭后会执行 finally 代码块,可以在这里可以进行重连操作 public class NettyClient implements Runnable { private final ...

  4. Netty(六):Netty中的连接管理(心跳机制和定时断线重连)

    何为心跳 顾名思义, 所谓心跳, 即在TCP长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 为什么需要心跳 因为网络的不可靠性, 有可 ...

  5. Netty — 心跳检测和断线重连

    一.前言 由于在通信层的网络连接的不可靠性,比如:网络闪断,网络抖动等,经常会出现连接断开.这样对于使用长连接的应用而言,当突然高流量冲击势必会造成进行网络连接,从而产生网络堵塞,应用响应速度下降,延 ...

  6. netty的断线重连问题

    手里的这个项目需要作为客户端,不断的接收服务端发来的数据,用的netty框架,但是一直存在一个问题,就是断线重连问题. 什么是断线重连呢? 就是我们这个客户端要保证一直与服务端保持连接,这样客户端才能 ...

  7. Netty 如何实现心跳机制与断线重连?

    作者:sprinkle_liz www.jianshu.com/p/1a28e48edd92 心跳机制 何为心跳 所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, ...

  8. netty4 断线重连

    转载:http://www.tuicool.com/articles/B7RzMbY 一 实现心跳检测 原理:当服务端每隔一段时间就会向客户端发送心跳包,客户端收到心跳包后同样也会回一个心跳包给服务端 ...

  9. 关于socket tcp 断线重连

    这个问题困扰过我几次,都没有来得及研究,今天研究一下. 首先写一个最简易的socket tcp程序,连接成功后再关闭服务器然后再用客户端各种操作看是什么情况 测试表明 (1)客户端已经连接,当服务端关 ...

随机推荐

  1. BZOJ2038 [2009国家集训队]小Z的袜子 莫队+分块

    作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从 ...

  2. 鸟哥Linux私房菜基础学习篇学习笔记1

    鸟哥Linux私房菜基础学习篇学习笔记1 第三章 主导分区(MBR),当系统在开机的时候会主动去读取这个区块的内容,必须对硬盘进行分区,这样硬盘才能被有效地使用. 所谓的分区只是针对64Bytes的分 ...

  3. 028_nginx_https证书

    一. 事件经过 2017年3月份谷歌和火狐的调查人员发现赛门铁克打破了行业规则误签发127张SSL证书随着调查进一步开展发现误签发的证书数量达到惊人的3万多张. 这个数字震撼了业界专家因为赛门铁克是市 ...

  4. MD5加密算法工具类

    import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorith ...

  5. POJ 3368

    题意: 给你一组数列, 查询区间内有出现次数最多的数的频数 RMQ , 对于一个区间, 分为两部分, 从  L 开始连续到  T  , T + 1 到  R 显然 答案为  MAX (T – L + ...

  6. [PHP]PDO各方法在发生MYSQL断开时的反应

    1.mixed PDO::errorCode ( void ) 如果单独执行此语句,并不能判断此时MYSQL是否已断开,它返回最上一次对MYSQL操作的错误码 2.public array PDO:: ...

  7. IntellJ IDEA下写JUnit

     安装配置JUnit  File->Settings->Plugins->Browse Repositories->在右侧搜索框输入"junit"-> ...

  8. Net 4.5 WebSocket 在 Windows 7, Windows 8 and Server 2012上的比较

    .Net 4.5 WebSocket Server Running on Windows 7? Net 4.5 WebSocket Server 可以运行在 Windows 7,但是Net 4.5的 ...

  9. Confluence 6 配置 MySQL 服务器

    在这一步,你将要配置你的 MySQL 数据库服务器. 注意: 如果你尝试连接你的 Confluence 到一个已经存在的 MySQL 数据库服务器.我们强烈建议你按照下面描述的安装步骤在 MySQL ...

  10. leetcode(js)算法之696计数二进制串

    给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的. 重复出现的子串要计算它们出现的次数. 示例: 输入: "0011 ...