当我们用Netty实现一个TCP client时,我们当然希望当连接断掉的时候Netty能够自动重连。
Netty Client有两种情况下需要重连:

  1. Netty Client启动的时候需要重连
  2. 在程序运行中连接断掉需要重连。

对于第一种情况,Netty的作者在stackoverflow上给出了解决方案
对于第二种情况,Netty的例子uptime中实现了一种解决方案

而Thomas在他的文章中提供了这两种方式的实现的例子。

实现ChannelFutureListener 用来启动时监测是否连接成功,不成功的话重试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Client 
 
   private EventLoopGroup loop = new NioEventLoopGroup(); 
   public static void main( String[] args ) 
   
     new Client().run(); 
   
   public Bootstrap createBootstrap(Bootstrap bootstrap, EventLoopGroup eventLoop) {  
     if (bootstrap != null) { 
       final MyInboundHandler handler = new MyInboundHandler(this); 
       bootstrap.group(eventLoop); 
       bootstrap.channel(NioSocketChannel.class); 
       bootstrap.option(ChannelOption.SO_KEEPALIVE, true); 
       bootstrap.handler(new ChannelInitializer<SocketChannel>() { 
         @Override 
         protected void initChannel(SocketChannel socketChannel) throws Exception { 
           socketChannel.pipeline().addLast(handler); 
         
       }); 
       bootstrap.remoteAddress("localhost"8888);
       bootstrap.connect().addListener(new ConnectionListener(this));
     
     return bootstrap; 
   
   public void run() { 
     createBootstrap(new Bootstrap(), loop);
   
 }

ConnectionListener 负责重连:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ConnectionListener implements ChannelFutureListener { 
  private Client client; 
  public ConnectionListener(Client client) { 
    this.client = client; 
  
  @Override 
  public void operationComplete(ChannelFuture channelFuture) throws Exception {  
    if (!channelFuture.isSuccess()) { 
      System.out.println("Reconnect"); 
      final EventLoop loop = channelFuture.channel().eventLoop(); 
      loop.schedule(new Runnable() { 
        @Override 
        public void run() { 
          client.createBootstrap(new Bootstrap(), loop); 
        
      }, 1L, TimeUnit.SECONDS); 
    
  
}

同样在ChannelHandler监测连接是否断掉,断掉的话也要重连:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MyInboundHandler extends SimpleChannelInboundHandler { 
   private Client client; 
   public MyInboundHandler(Client client) { 
     this.client = client; 
   
   @Override 
   public void channelInactive(ChannelHandlerContext ctx) throws Exception {  
     final EventLoop eventLoop = ctx.channel().eventLoop(); 
     eventLoop.schedule(new Runnable() { 
       @Override 
       public void run() { 
         client.createBootstrap(new Bootstrap(), eventLoop); 
       
     }, 1L, TimeUnit.SECONDS); 
     super.channelInactive(ctx); 
   
 }

参考文档

  • http://stackoverflow.com/questions/19739054/whats-the-best-way-to-reconnect-after-connection-closed-in-netty
  • https://github.com/netty/netty/blob/master/example/src/main/java/io/netty/example/uptime/UptimeClientHandler.java
  • http://tterm.blogspot.jp/2014/03/netty-tcp-client-with-reconnect-handling.html
  • ctx.close vs ctx.channel().close
  • ctx.write vs ctx.channel().write

Netty Client 重连实现的更多相关文章

  1. Netty Client重连实现

    from:http://itindex.net/detail/54161-netty-client 当我们用Netty实现一个TCP client时,我们当然希望当连接断掉的时候Netty能够自动重连 ...

  2. Netty断线重连

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

  3. Android Netty Client

    Android netty client Start a netty client on android Download netty Download url :https://netty.io/d ...

  4. Netty 自动重连

    from: http://www.dozer.cc/2015/05/netty-auto-reconnect.html 自动重连 用 Netty 写 Client 和 Server 的时候必须要去处理 ...

  5. Netty 断线重连解决方案

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

  6. Netty Client和Server端实现

    本文基于Nett4.0.26.Final版本浅析Client与Server端通讯,先看服务器端: public class Server { public static void run(int po ...

  7. 最新Java面试题及答案整理

    基础篇 一.基本功 面向对象特征 封装,继承,多态和抽象 1. 封装 封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内部的数据.在 Java 当中,有 3 种修饰 ...

  8. 2018年最新Java面试题及答案整理

    基础篇 基本功 面向对象特征 封装,继承,多态和抽象 封装封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内部的数据.在 Java 当中,有 3 种修饰符: pub ...

  9. 2018年最新Java面试题及答案整理(持续完善中…)

    2018年最新Java面试题及答案整理(持续完善中…) 基础篇 基本功 面向对象特征 封装,继承,多态和抽象 封装封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内 ...

随机推荐

  1. LeetCode第[42]题(Java):Trapping Rain Water (数组方块盛水)——HARD

    题目:接雨水 难度:hard 题目内容: Given n non-negative integers representing an elevation map where the width of ...

  2. python函数式编程之返回函数、匿名函数、装饰器、偏函数学习

    python函数式编程之返回函数 高阶函数处理可以接受函数作为参数外,还可以把函数作为结果值返回. 函数作为返回值 def laxy_sum(*args): def sum(): ax = 0; fo ...

  3. 【Hive】窗口函数

    我们都知道在sql中有一类函数叫做聚合函数,例如sum().avg().max()等等, 这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的. 但是有时我们想要既显示 ...

  4. 【poj2553】The Bottom of a Graph(强连通分量缩点)

    题目链接:http://poj.org/problem?id=2553 [题意] 给n个点m条边构成一幅图,求出所有的sink点并按顺序输出.sink点是指该点能到达的点反过来又能回到该点. [思路] ...

  5. mybatis分页插件使用注意

    之前的项目用的数据库是mysql,在pom.xml引入这一个就能分页了. 后来又开了一个项目,使用的是oracle数据库,我写分页的时候发现不能实现,在网上找到资料说是必须要5.0以上的.我就导了这依 ...

  6. fastclick插件 导致 日期插件无法触发

    fastclick源文件中有这一行,加个if条件就可以了 当touchend的时候我们判断一下他的event.target到底是啥,如果是date我们就不玩了,不要你fastclick了,用原生的去触 ...

  7. UI - 视图控制器跳转另一个视图控制器特效总结

    1. 从一个视图控制器跳转另一个视图控制器的方式是可以进行设置的 CATransition *animation = [[CATransition alloc]init]; animation.dur ...

  8. New Concept English three (40)

    23w/m 48 errors It has never been explained why university students seem to enjoy practical jokes mo ...

  9. Windows 使用技巧

    怎样添加“发送到”的快捷方式,cmd里面shell:sendto打开文件夹,把快捷方式放进去就可以了. vs中c#快速实现接口所有函数快捷键: 鼠标放在实现的接口上面+shift+alt+F10.

  10. Android中自动跳转

    先看效果图吧    -------->        -------->   Activity类 package com.xm; import java.io.File; import j ...