gpt4 book ai didi

java - Netty 关闭/停止 UDP 服务器

转载 作者:行者123 更新时间:2023-12-02 10:40:51 56 4
gpt4 key购买 nike

我正在尝试创建 Netty UDP 监听器。我面临的问题是我无法像tcp一样停止udp服务器,udp总是在运行,即使调用shutdowngraceful,停止它的唯一方法是抛出异常。

private int port;
private UDPViewModel viewModel;
private DefaultEventLoopGroup defaultEventLoopGroup;

public UdpServer(UDPViewModel viewModel, int port) {
this.port = port;
this.viewModel = viewModel;
}

@Override
public void run() {
defaultEventLoopGroup = new DefaultEventLoopGroup();
try {

ServerBootstrap bootstrap = new ServerBootstrap()
.channel(UdpServerChannel.class)
.group(defaultEventLoopGroup)
.childHandler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel channel) {
channel.pipeline()
.addLast(new ReadTimeoutHandler(5))
.addLast(new UdpServerHandler(viewModel));
}
});
bootstrap.bind(port).sync().channel().closeFuture().syncUninterruptibly().await();

System.out.println("UDP Server : [successfully started]");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
defaultEventLoopGroup.shutdownGracefully();
}
}

有人知道如何正确关闭 netty udp 服务器吗?

最佳答案

首先,我假设您使用这个 git repo顺便说一下,这写得很差。此外,我建议不要使用它,因为 UDP 不适合在服务器/客户端模型中使用,并且 repo 所做的只是管理您不存在的 UDP channel ,因为 UDP 是无连接的。它真正做的只是存储一个假 channel 实例,其核心只是一个 InetAddress。您可以做的是使用普通的线程安全 List 或某种存储来存储您想要缓存的不同 InetAddress 并使用它。

但是,如果您确实需要使用此存储库,则需要停止 ServerChannel 实例,因为 UdpServerChannel 启动一个新的事件循环,该事件循环不暴露于外部并且可以仅在关闭 channel 时停止。 (这是您不应该使用它的另一个原因,为同一件事打开多个 EventLoopGroups 是浪费)

关于java - Netty 关闭/停止 UDP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52926129/

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