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
您的支持是對博主最大的鼓勵,感謝您的認真閱讀。
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM