2

マルチキャスト グループのメッセージを送受信できる 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));
4

0 に答える 0