为了账号安全,请及时绑定邮箱和手机立即绑定

Netty 关闭/停止 UDP 服务器

Netty 关闭/停止 UDP 服务器

白板的微信 2021-12-01 16:09:43
我正在尝试创建 Netty UDP 侦听器。我面临的问题是我无法像 tcp 一样停止 udp 服务器,udp 始终在运行,即使正常调用了关机,停止它的唯一方法是抛出异常。private int port;private UDPViewModel viewModel;private DefaultEventLoopGroup defaultEventLoopGroup;public UdpServer(UDPViewModel viewModel, int port) {   this.port = port;   this.viewModel = viewModel;}@Overridepublic 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 服务器有任何想法吗?
查看完整描述

2 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

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

但是如果你真的需要使用这个 repo,你需要停止ServerChannel实例,因为它UdpServerChannel启动了一个新的事件循环,它不会暴露在外面,只能在关闭通道时停止。(这是你不应该使用它的另一个原因,EventLoopGroups为同一件事打开多个是浪费的)


查看完整回答
反对 回复 2021-12-01
?
森林海

TA贡献2011条经验 获得超2个赞

我想我找到了另一种方法来解决这个问题。我的问题的解决方案,它不是完美的,但它做了我想要的。


public class UdpServer {


private int port;

private UDPViewModel viewModel;

private final EventLoopGroup nioEventLoopGroup;

private ChannelFuture channelFuture;


public UdpServer(UDPViewModel viewModel, int port) {

   this.port = port;

   this.viewModel = viewModel;

    nioEventLoopGroup = new NioEventLoopGroup();

}


public void run() {

    System.out.println("UDP Server is starting.");

    try{

        Bootstrap bootstrap = new Bootstrap();

        bootstrap.group(nioEventLoopGroup)

                .channel(NioDatagramChannel.class)

                .handler(new ChannelInitializer<Channel>() {

                    @Override

                    protected void initChannel(Channel channel) {

                        channel.pipeline().addLast(

                                new LoggingHandler(LogLevel.INFO),

                                new StringEncoder(), new StringDecoder());

                        channel.pipeline().addLast(

                                new UdpServerHandler(viewModel));

                    }

                });

        channelFuture = bootstrap.bind(port).sync();


    }

    catch (InterruptedException e) {

        System.err.println("UDP listener was interrupted and shutted down");

        e.getCause();

    }

}


public void StopServer()

{

    try {

        nioEventLoopGroup.shutdownGracefully().sync();

        channelFuture.channel().closeFuture().sync();

    } catch (InterruptedException e) {

        e.printStackTrace();

    }

}

}



查看完整回答
反对 回复 2021-12-01
  • 2 回答
  • 0 关注
  • 746 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信