netty 4.xx中的UDP广播

我们需要使用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复制此方案。 请向我们提供示例代码。

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

在Netty 4中,您必须传递消息内部的地址,直到您准备好创建DatagramPacket

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

您还可以使用DatagramPacketEncoder来封装MessageToMessageEncoder并为您的AddressedEnvelopes和ByteBufs创建DatagramPackets。 这并没有真正增加太多便利,所以我不能说我推荐它。

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

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