Java netty-多播通道可以接收或发送,但不能同时接收和发送

Java netty-多播通道可以接收或发送,但不能同时接收和发送,java,netty,Java,Netty,我正在尝试使用netty创建一个多播频道,通过它我可以发送和接收多播组的消息。 我创建了如下的引导实例 channelFactory = new OioDatagramChannelFactory( workerExecutor ); bootstrap = new ConnectionlessBootstrap( channelFactory ); bootstrap.setOption( "broadcast", true ); bootstrap.setOption( "reuseAddr

我正在尝试使用netty创建一个多播频道,通过它我可以发送和接收多播组的消息。
我创建了如下的引导实例

channelFactory = new OioDatagramChannelFactory( workerExecutor );
bootstrap = new ConnectionlessBootstrap( channelFactory );
bootstrap.setOption( "broadcast", true );
bootstrap.setOption( "reuseAddress", true );
DatagramChannel channel;
channel = (DatagramChannel) bootstrap.bind( new InetSocketAddress( mcastPort) );
channel.joinGroup( multicastAddress );
稍后,通道是这样创建的

channelFactory = new OioDatagramChannelFactory( workerExecutor );
bootstrap = new ConnectionlessBootstrap( channelFactory );
bootstrap.setOption( "broadcast", true );
bootstrap.setOption( "reuseAddress", true );
DatagramChannel channel;
channel = (DatagramChannel) bootstrap.bind( new InetSocketAddress( mcastPort) );
channel.joinGroup( multicastAddress );
使用此代码,我可以接收多播组的消息,但需要一个简单的
channel.write()与NPE一起失败

java.lang.NullPointerException: null address || null buffer
    at java.net.TwoStacksPlainDatagramSocketImpl.send(Native Method)
    at java.net.DatagramSocket.send(DatagramSocket.java:675)
    at org.jboss.netty.channel.socket.oio.OioDatagramWorker.write(OioDatagramWorker.java:121)
    at org.jboss.netty.channel.socket.oio.OioDatagramPipelineSink.eventSunk(OioDatagramPipelineSink.java:84)
    at *.*.*PacketHandler.writeRequested(*PacketHandler.java:72)
    at org.jboss.netty.channel.Channels.write(Channels.java:611)
    at org.jboss.netty.channel.Channels.write(Channels.java:578)
    at org.jboss.netty.channel.AbstractChannel.write(AbstractChannel.java:251)
    at org.jboss.netty.channel.group.DefaultChannelGroup.write(DefaultChannelGroup.java:261)
因为异常表明事件没有指定远程地址。
因为我不想在每次调用
Channel#connect
时传递多播地址

DatagramChannel channel;
channel = (DatagramChannel) bootstrap.bind( new InetSocketAddress( mcastPort) );
channel.joinGroup( multicastAddress );
channel.connect( new InetSocketAddress(multicastAddress, mcastPort) );
现在发送消息非常有效,但我不再接收消息

我做错了什么?我用的是netty 3.2.7.Final

编辑
以下是我对内蒂行为的期望。
它们是有效的还是我误解了什么


你能试着升级到netty 3.5.8.Final吗?@NormanMaurer不幸的是,这并没有改变任何事情(这不是数据报套接字的工作原理吗?在没有Netty的情况下,您如何实现所需的行为?有可能吗?如果有,请随意粘贴一个片段。@Trustinley在
DatagramChannel#connect
之后,套接字将远程地址放在每个下游事件中,这样就允许两者都接收t的数据包,这难道没有意义吗他创建了多播组,并将数据包发送给该组的所有侦听对等方。否则,通道只能充当发送方或接收方,但不能同时充当两者。我当前的解决方法是加入多播组,并向管道添加一个
ChannelDownstreamHandler
,该管道将实际目标地址设置为多播地址和端口。因此连接到频道不需要再次指定多播地址。能否尝试升级到netty 3.5.8.Final?@NormanMaurer很遗憾,这不会改变任何内容:(这不是数据报套接字的工作原理吗?在没有Netty的情况下,您如何实现所需的行为?有可能吗?如果有,请随意粘贴一个片段。@Trustinley在
DatagramChannel#connect
之后,套接字将远程地址放在每个下游事件中,这样就允许两者都接收t的数据包,这难道没有意义吗他创建了多播组,并将数据包发送给该组的所有侦听对等方。否则,通道只能充当发送方或接收方,但不能同时充当两者。我当前的解决方法是加入多播组,并向管道添加一个
ChannelDownstreamHandler
,该管道将实际目标地址设置为多播地址和端口。因此向频道发送不需要再次指定多播地址。