当前位置: 首页 > news >正文

Netty断线重连

Netty断线重连

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

创建连接

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

  1. EventLoopGroup group = new NioEventLoopGroup(); 
  2. private volatile Bootstrap bootstrap; 
  3.  
  4. public void init(String host, int port) throws RobotException
  5. this.serverIp = host; 
  6. this.serverPort = port; 
  7. try
  8. // 创建并初始化 Netty 客户端 Bootstrap 对象 
  9. bootstrap = configureBootstrap(new Bootstrap(),group); 
  10. bootstrap.option(ChannelOption.TCP_NODELAY, true); 
  11. doConnect(bootstrap); 

  12. catch(Exception ex){ 
  13. ex.printStackTrace(); 
  14. throw new RobotException("connect remote control server error!",ex.getCause()); 


  15.  
  16. Bootstrap configureBootstrap(Bootstrap b, EventLoopGroup g)
  17. b.group(g).channel(NioSocketChannel.class) 
  18. .remoteAddress(serverIp, serverPort) 
  19. .handler(new ChannelInitializer<SocketChannel>() { 
  20. @Override 
  21. public void initChannel(SocketChannel channel) throws Exception
  22. ChannelPipeline pipeline = channel.pipeline(); 
  23. // 编解码器 
  24. pipeline.addLast(protoCodec); 
  25. // 请求处理 
  26. pipeline.addLast(RobotClient.this); 

  27. }); 
  28.  
  29. return b; 

  30.  
  31. void doConnect(Bootstrap b)
  32. try
  33.  
  34. ChannelFuture future = b.connect(); 
  35. future.addListener(new ChannelFutureListener() { 
  36. @Override 
  37. public void operationComplete(ChannelFuture future) throws Exception
  38. if (future.isSuccess()) { 
  39. System.out.println("Started Tcp Client: " + serverIp); 
  40. } else
  41. System.out.println("Started Tcp Client Failed: "); 

  42. if (future.cause() != null) { 
  43. future.cause().printStackTrace(); 

  44.  

  45. }); 
  46. } catch (Exception e) { 
  47. 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.  
  9. final EventLoop loop = ctx.channel().eventLoop(); 
  10. loop.schedule(new Runnable() { 
  11. @Override 
  12. public void run()
  13. doConnect(configureBootstrap(new Bootstrap(), loop)); 

  14. }, 1, TimeUnit.SECONDS); 


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


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

相关文章:

  • 不要小看了get 与set
  • redhat7.2升级openssl、openssh
  • [HAOI2016]食物链
  • 事物分析的维度
  • 调查微软恶意升级 Windows 10 请愿即将达成
  • DB-Engines 4 月份全球数据库排名,MySQL 跌幅最大
  • Cmd Markdown 发布第十四次更新 --- 使命的召唤
  • npm 宣布协作工具 Orgs 免费,可不限量管理公有包
  • 类orAPI - 收藏集 - 掘金
  • 关于W8.1不能安装VS2015(包括2017等)
  • 前端性能优化之优化图片 优化显示图片
  • Java中的重写
  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)
  • TeamCity 2017.1.2 发布,持续集成工具
  • 微软:请叫我 Android 预装服务提供商
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • es6(二):字符串的扩展
  • HTTP中GET与POST的区别 99%的错误认识
  • Laravel 实践之路: 数据库迁移与数据填充
  • maven工程打包jar以及java jar命令的classpath使用
  • opencv python Meanshift 和 Camshift
  • Python_网络编程
  • SwizzleMethod 黑魔法
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • windows下mongoDB的环境配置
  • 对超线程几个不同角度的解释
  • 对象管理器(defineProperty)学习笔记
  • 分布式熔断降级平台aegis
  • 观察者模式实现非直接耦合
  • 面试总结JavaScript篇
  • 前端js -- this指向总结。
  • 深入浅出Node.js
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 线上 python http server profile 实践
  • 进程与线程(三)——进程/线程间通信
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​Java并发新构件之Exchanger
  • #{}和${}的区别是什么 -- java面试
  • #162 (Div. 2)
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (C语言)共用体union的用法举例
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (多级缓存)缓存同步
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .Mobi域名介绍
  • .NET : 在VS2008中计算代码度量值
  • .Net Core和.Net Standard直观理解
  • .NET 解决重复提交问题
  • .NET开发人员必知的八个网站