java - netty中如何在断开连接后自动连接到TCP服务器

标签 java sockets tcp netty

我有一个场景,我正在使用 netty NIO 建立 TCP 连接,假设服务器出现故障,那么当它再次出现时我如何自动连接到服务器? 或者有什么方法可以在服务器上附加可用性监听器吗?

最佳答案

您可以有一个 DisconnectionHandler,作为客户端管道上的第一件事,它通过立即尝试重新连接或安排重新连接任务来对 channelInactive 使用react。

例如,

public class DisconnectionHandler extends ChannelInboundHandlerAdapter {

  @Override
  public void channelInactive(final ChannelHandlerContext ctx) throws Exception   {

    Channel channel = ctx.channel();
    
    /* If shutdown is on going, ignore */
    if (channel.eventLoop().isShuttingDown()) return;
    
    ReconnectionTask reconnect = new ReconnectionTask(channel);
    reconnect.run();
  }

}

ReconnectionTask 应该是这样的:

public class ReconnectionTask implements Runnable, ChannelFutureListener {

    Channel previous;
    
    public ReconnectionTask(Channel c) {
        this.previous = c;
    }

    @Override
    public void run() {
         Bootstrap b = createBootstrap();
         b.remoteAddress(previous.remoteAddress())
          .connect()
          .addListener(this);
    }
    
    @Override
    public void operationComplete(ChannelFuture future) throws Exception {
        if (!future.isSuccess()) {
            // Will try to connect again in 100 ms.
            // Here you should probably use exponential backoff or some sort of randomization to define the retry period.
            previous.eventLoop()
                    .schedule(this, 100, MILLISECONDS); 
            return;
        }
        // Do something else when success if needed.
    }
}

在此处查看 Exponential Backoff library 的示例.

关于java - netty中如何在断开连接后自动连接到TCP服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36408662/

相关文章:

java - Java 中 new 运算符与 newInstance() 的性能对比

c# - if 语句的性能与使用接口(interface)相比如何?

java - java中如何避免形状超出框架的边界

c# - 断开连接后,C#客户端/服务器套接字将无法再次连接

javascript - Socket.io - 旧版本的 app.js 到新版本的 socket.io

linux - 试图在服务器上捕获单向 tcp 数据

java - 用于在线桌面应用程序的 Java 框架

python - Golang net.Listen 绑定(bind)到已在使用的端口

c - 读取 TCP 选项字段

python - 在没有端口转发的情况下连接到已知的外部 ip 和内部 ip