gpt4 book ai didi

java - 在没有 closeFuture().sync() 的情况下在 Netty 中运行多个服务器

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:25:07 31 4
gpt4 key购买 nike

我正在开发 Netty 应用程序。我想在不同的端口上运行多个服务器,如果没有(阻塞)closeFuture().sync() 就无法工作。

我使用以下代码在我的 ServerManager 类中启动服务器:

gpcmServer = new GpcmServer(port);

gpspServer = new GpspServer(port);

在这些类中,我按如下方式启动服务器:

public GpspServer(int port) throws InterruptedException {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
// Add the server handler and its decoder
ch.pipeline().addLast(new GpspDecoder(), new GpspServerHandler());
}
})
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true);

// Bind and start to accept incoming connections.
bindFuture = bootstrap.bind(port).sync();

bindFuture.channel().closeFuture();
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}

但是,当我不调用closeFuture().sync()时,我无法连接到服务器。当我将 .sync() 添加到 bindFuture.channel().closeFuture() 时,我可以连接到服务器。我怎样才能继续这样做并使服务器正常工作?

最佳答案

当您调用 EventLoopGroup.shutdown*() 方法时,事件循环将在终止自身之前关闭它管理的所有套接字和服务器套接字。因此,如果您没有等到服务器套接字关闭,您的 finally block 将完全终止您的服务器。

运行多个服务器实际上需要做的是:

  • 绑定(bind)多次,
  • 不要调用shutdownGracefully(),直到您想关闭服务器。

关于java - 在没有 closeFuture().sync() 的情况下在 Netty 中运行多个服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28947127/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com