netty 4.x.x中的UDP广播

时间:2012-10-03 12:42:13

标签: java udp netty

我们需要使用Netty 4.0.0二进制文件在UDP通道上广播一个Object(Pojo) 在Netty 4.0.0中,它允许我们仅使用DatagramPacket类来发送UDP数据包 该类仅接受ByteBuf作为参数。

还有其他方法,我们可以通过UDP通道发送Pojo吗?

为进一步澄清,我们采取以下措施:

初始化UDP通道的设置

ConnectionlessBootstrap udpBootstrap;
udpBootstrap.setPipelineFactory(new ChannelPipelineFactory() {
            public ChannelPipeline getPipeline() throws Exception {
                return Channels.pipeline(
                        new ObjectEncoder(),
                        new ObjectDecoder(new NettyElementInfo()),
                        new UDPBroadcastHandler());
            }
        });
        udpBootstrap.setOption("broadcast", true);
        //datagramChannel = (DatagramChannel) udpBootstrap.bind(new InetSocketAddress(udp_port));
        datagramChannel = (DatagramChannel) udpBootstrap.bind(new InetSocketAddress(0));

这里,NettyElementInfo实现了Serializable和ClassResolver接口。我们试图按如下方式广播这个pojo:

channel.write(new NettyElementInfo(), 
                new InetSocketAddress("255.255.255.255", 9555));

在接收端,我们对上面的初始化部分做了同样的事情。但是,在处理程序中获取Pojo如下:

NettyElementInfo elementInfo = (NettyElementInfo)e.getMessage();

使用netty 3.5.x

成功完成了这项工作

如何使用Netty 4.0.0复制此方案。请向我们提供示例代码。

2 个答案:

答案 0 :(得分:1)

我认为你可以拥有一个MessageToMessageDecoder / MessageToMessageEncoder,它将把DatagramPacket编码/解码为ByteBuf,实际上只需要调用DatagramPacket.data()进行解码(就像例子一样)。在编码器/解码器之后,您可以添加通常的其他ChannelHandler来处理ByteBuf到Pojo的解码。

答案 1 :(得分:0)

在Netty 4中,您必须传递邮件中的地址,直到您准备好创建DatagramPacket

您可以手动执行此操作,也可以使用内置的DefaultAddressedEnvelope

您还可以使用包裹DatagramPacketEncoder的{​​{1}}并为您的AddressedEnvelopes和ByteBufs创建DatagramPackets。这并没有增加太多便利,所以我不能说我推荐它。

MessageToMessageEncoder

变为

pipeline.addLast (new ObjectEncoder());
...
channel.write(new NettyElementInfo(),  
            new InetSocketAddress("255.255.255.255", 9555));