4

我们需要使用 Netty 4.0.0 二进制文件通过 UDP 通道广播对象(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 复制此场景。请向我们提供示例代码。

4

2 回答 2

2

我认为您可以只拥有一个 MessageToMessageDecoder/MessageToMessageEncoder 将 DatagramPacket 编码/解码为 ByteBuf,实际上只是调用 DatagramPacket.content() 进行解码(仅作为示例)。在编码器/解码器之后,您可以添加通常的其他 ChannelHandler,它们将处理 ByteBuf 的解码到 Pojo。

于 2012-10-04T05:10:04.250 回答
0

在 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)));
于 2018-05-13T13:04:23.107 回答