Netty Client重连实现

from:http://itindex.net/detail/54161-netty-client

当我们用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);  

}  

}

参考文档

  1. http://stackoverflow.com/questions/19739054/whats-the-best-way-to-reconnect-after-connection-closed-in-netty
  2. https://github.com/netty/netty/blob/master/example/src/main/java/io/netty/example/uptime/UptimeClientHandler.java
  3. http://tterm.blogspot.jp/2014/03/netty-tcp-client-with-reconnect-handling.html
  4. ctx.close vs ctx.channel().close
  5. ctx.write vs ctx.channel().write
时间: 2024-10-10 08:58:36

Netty Client重连实现的相关文章

Netty 自动重连

from: http://www.dozer.cc/2015/05/netty-auto-reconnect.html 自动重连 用 Netty 写 Client 和 Server 的时候必须要去处理自动重连. Server 端启动时的错误,要去不断重试. Client 端不仅要处理启动时的错误,还要处理中途断开连接. Server 端的处理 和常规的代码相比,Server 端只要处理一个地方即可: public final class TcpServer { private volatile

Netty Client和Server端实现

本文基于Nett4.0.26.Final版本浅析Client与Server端通讯,先看服务器端: public class Server { public static void run(int port) { /**Netty创建ServerSocketChannel,默认SelectionKey.OP_ACCEPT*/ EventLoopGroup boss = new NioEventLoopGroup(); EventLoopGroup worker = new NioEventLoop

Netty学习篇④-心跳机制及断线重连

心跳检测 前言 客户端和服务端的连接属于socket连接,也属于长连接,往往会存在客户端在连接了服务端之后就没有任何操作了,但还是占用了一个连接:当越来越多类似的客户端出现就会浪费很多连接,netty中可以通过心跳检测来找出一定程度(自定义规则判断哪些连接是无效链接)的无效链接并断开连接,保存真正活跃的连接. 什么叫心跳检测 我理解的心跳检测应该是客户端/服务端定时发送一个数据包给服务端/客户端,检测对方是否有响应: 如果是存活的连接,在一定的时间内应该会收到响应回来的数据包: 如果在一定时间内

Netty实例-简单的服务端-client实现,凝视具体

       书籍推荐:                                       实例代码 :http://download.csdn.net/detail/jiangtao_st/7677503 w=unionnojs&f=http%3A%2F%2Fai.taobao.com%2Fauction%2Fedetail.htm%3Fe%3DNwfw%252Fe17lVwjmraEDZVrLn4D8gsQRSnlTCbL1Om%252BR1KLltG5xFicOdXrTUTgh9

一起学Netty(十四)之 Netty生产级的心跳和重连机制

sigh,写这篇博客的时候老脸还是红了一下,心里还是有些唏嘘的,应该算是剽窃吧,每个人的代码功力的确是有差距的,好在文章的标题是"一起学",而不是开涛大神的"跟我学"系列的文章,我们还是多花点时间学习吧,感叹无用~ 最近工作比较忙,但闲暇之余还是看了阿里的冯家春(fengjiachun)的github上的开源代码Jupiter,写的RPC框架让我感叹人外有人,废话不多说,下面的代码全部截取自Jupiter,写了一个比较完整的例子,供大家一起学习分享,再次对@Luca

基于Netty的私有协议栈的开发

基于Netty的私有协议栈的开发 书是人类进步的阶梯,每读一本书都使自己得以提升,以前看书都是看了就看了,当时感觉受益匪浅,时间一长就又还回到书本了!所以说,好记性不如烂笔头,以后每次看完一本书都写一些读后感,对于技术书则把对让自己醍醐灌顶的篇章记录下来,以便以后翻阅查看,也是记录自己学习的过程- _ -. OK!言归正传,最近由于公司需要做一个网关项目,需要用到基于TCP/IP私有协议接收数据,看完了<Netty权威指南>这本书,感觉作者写的很好,有些地方让我获益良多,虽然书上有些例子跑不通

使用Netty实现远程方法调用(RPC)

使用Netty实现远程方法调用(RPC) 很多情况下,我们可能需要用到调用远程方法的时候.比如,我们有统一的布隆过滤器,其它服务需要调用布隆过滤器进行判重:比如,我们需要调用统一的缓存数据:比如我们需要跨机器调用一些服务方法等等.这些时候都可以使用远程方法调用. 接下来,开始讲解使用Netty实现远程方法调用的步骤. 代码目录结构为: nettynetty/client//RPC消息回调类netty/client/MessageCallBack.java//Rpc客户端管道初始化netty/cl

Netty整合SpringBoot并使用Protobuf进行数据传输

前言 本篇文章主要介绍的是SpringBoot整合Netty以及使用Protobuf进行数据传输的相关内容.Protobuf会介绍下用法,至于Netty在netty 之 telnet HelloWorld 详解中已经介绍过了,这里就不再过多细说了. Protobuf 介绍 Protocol Buffer是Google的语言中立的,平台中立的,可扩展机制的,用于序列化结构化数据 - 对比XML,但更小,更快,更简单.您可以定义数据的结构化,然后可以使用特殊生成的源代码轻松地在各种数据流中使用各种语

Netty高级

Netty快速入门 什么是Netty Netty 是一个基于 JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性. Netty应用场景 1.分布式开源框架中dubbo.Zookeeper,RocketMQ底层rpc通讯使用就是netty. 2.游戏开发中,底层使用netty通讯. 为什么选择netty 在本小节,我们总结下为什么不建议开发者直接使用JDK的NIO类库进行开发的原因: 1)      NIO的类库和API繁杂,使用麻烦,你需