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)));