netty 心跳与IdleStateHandler与断线重连

    xiaoxiao2025-10-29  8

    netty的心跳机制只是触发事件,但没有包心跳包,需要自己发心跳包

     

     

     

    IdleStateHandler不是发心跳包,而是触发心跳机制,在你设定的时候内没有收到包,就触发读心跳,没有发包就触发写心跳,如果都没有,就触发all

     

     

     

     

     

     

     

    参考

    http://blog.csdn.net/albertfly/article/details/52182248

     

     

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

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

     

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

    而Thomas在他的 文章中提供了这两种方式的实现的例子。 实现ChannelFutureListener 用来启动时监测是否连接成功,不成功的话重试:       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 负责重连:       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监测连接是否断掉,断掉的话也要重连:       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);            }          }

     

     

     

     

    转载请注明原文地址: https://ju.6miu.com/read-1303653.html
    最新回复(0)