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

  • 相关阅读:
    (转)EDM邮件制作规范完整版
    (转)Gmail,你必须了解的12个邮件编码问题
    说说CakePHP的关联模型之一 基本关联
    HTML5 离线应用程序
    CakePHP模型中使用join的多种写法
    判断浏览器
    Javascript闭包例子
    安装wamp后,其显示目录的图标显示不出来
    underscore.js 分析 第二天
    HTML5心得
  • 原文地址:https://www.cnblogs.com/xiaoqi/p/6927387.html
Copyright © 2011-2022 走看看