2 回答
TA贡献1998条经验 获得超6个赞
首先,我假设你使用这个git repo,顺便说一下,它写得很差。此外,我建议不要使用它,因为 UDP 不打算在服务器/客户端模型中使用,并且 repo 所做的只是管理您的 UDP 通道,这些通道不存在,因为 UDP 是无连接的。它真正做的就是存储一个假的通道实例,它的核心只是一个InetAddress
. 你可以做的是使用普通线程安全List
或某种存储来InetAddress
缓存不同的东西,然后使用它。
但是如果你真的需要使用这个 repo,你需要停止ServerChannel
实例,因为它UdpServerChannel
启动了一个新的事件循环,它不会暴露在外面,只能在关闭通道时停止。(这是你不应该使用它的另一个原因,EventLoopGroups
为同一件事打开多个是浪费的)
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();
}
}
}
添加回答
举报