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