我有一个 UDP 多播应用程序,它将被硬编码以侦听特定的多播地址组。然而,虽然我能够拥有一个加入多个组的 NioDatagramChannel,但我的代码无法处理多个监听不同组的 NioDatagramChannel(有点像 Java NIO 选择器)。以下是我写的代码:
public class NettyTest implements Runnable {
public static void main(String[] args){
new NettyTest().run();
}
@Override
public void run() {
MulticastHandler handler = new MulticastHandler();
EventLoopGroup group = new NioEventLoopGroup();
try{
UDPChannel channel = new UDPChannel(5555, "eth0", "239.1.1.1");
UDPChannel channel2 = new UDPChannel(5555, "eth0", "225.1.1.1");
Bootstrap b = new Bootstrap();
NetworkInterface ni = NetworkInterface.getByName("eth0");
b.group(group)
.channel(NioDatagramChannel.class)
.option(ChannelOption.SO_REUSEADDR, true)
.option(ChannelOption.IP_MULTICAST_IF, ni)
.option(ChannelOption.SO_RCVBUF, 1500 * 200)
.handler(new ChannelInitializer<NioDatagramChannel>() {
@Override
protected void initChannel(NioDatagramChannel nioDatagramChannel) throws Exception {
nioDatagramChannel.pipeline().addLast(handler);
}
});
AttributeKey<Marker> markerKey = AttributeKey.valueOf("Marker");
NioDatagramChannel ch = (NioDatagramChannel)b.bind(5555).sync().channel();
ch.attr(markerKey).set(channel.getChannelMarker());
ch.joinGroup(new InetSocketAddress("239.1.1.1", 5555), ni).sync();
NioDatagramChannel ch1 =(NioDatagramChannel)b.bind(5555).sync().channel();
ch1.attr(markerKey).set(channel2.getChannelMarker());
ch1.joinGroup(new InetSocketAddress("225.1.1.1", 5555), ni).sync();
ch.closeFuture().await();
ch1.closeFuture().await();
} catch (InterruptedException | SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我已经尝试了上面的方法,我尝试一个接一个地等待两个频道的 closeFuture(),但这给出了一个
io.netty.channel.StacklessClosedChannelException at io.netty.channel.AbstractChannel$AbstractUnsafe.ensureOpen(ChannelPromise)(Unknown Source)
。能够处理这两个渠道的正确方法是什么?我不想将两者合并到一个通道中,因为两个通道上的消息可以具有相同的 ID 但具有不同的值(值特定于该通道)。