在 netty 中使用多个通道的正确程序是什么?

问题描述 投票:0回答:0

我有一个 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 但具有不同的值(值特定于该通道)。

java udp netty
© www.soinside.com 2019 - 2024. All rights reserved.