博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Netty断线重连
阅读量:6233 次
发布时间:2019-06-22

本文共 2149 字,大约阅读时间需要 7 分钟。

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

你可能感兴趣的文章
shell脚本编程之循环语句
查看>>
Binary file (standard input) matches(grep)
查看>>
利用apache的rotatelogs命令实现WebLogic启动命令的nohup的日志回滚
查看>>
百度内页排名的第二个秘诀
查看>>
python--集合概念和实战(二)
查看>>
Android开发环境错误处理
查看>>
高性能的开源http加速器Varnish
查看>>
MySQL执行计划解析
查看>>
Mysql Date 函数
查看>>
博客分类导航
查看>>
实战HMM-Viterbi角色标注地名识别
查看>>
Delphi 与 DirectX 之 DelphiX(58): TDIB.DoTile();
查看>>
如何打开记事本并显示指定内容 - 回复 "苦苦苦" 的问题
查看>>
android4.x新特征总结
查看>>
TClientDataSet[22]: 数组字段与 ObjectView
查看>>
Oracle Data Guard(1)
查看>>
我的友情链接
查看>>
实现iOS图片等资源文件的热更新化(三):动态的资源文件夹
查看>>
OK6410-使用DirecetFB支持Qt4.7.0
查看>>
python获取linux系统信息、性能阀值、短信网关发送的例子
查看>>