マルチキャスト グループのメッセージを送受信できる 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 );
このコードを使用すると、マルチキャスト グループのメッセージを受信できますが、単純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 の振る舞いに対する私の期待です。
それらは有効ですか、それとも何か誤解していますか?
// DatagramSocket bound to network interface "192.168.0.15" and port 12345
channel = (DatagramChannel) bootstrap.bind( new InetSocketAddress( "192.168.0.15", 12345) );
// Send IGMP Join to "239.195.255.255" in order to receive multicast packets
channel.joinGroup("239.195.255.255");
// Possibility 1
// Channels remote address gets set
channel.connect(new InetSocketAddress("239.195.255.255", 12345));
// packets gets send over interface "192.168.0.15" port 12345 to "239.195.255.255:12345"
channel.write(something);
// Possibility 2
// Send packet to explicit address
channel.write(something, new InetSocketAddress("239.195.255.255", 12345));