2012-10-03 32 views
3

我們需要使用Netty 4.0.0二進制文件通過UDP通道廣播對象(Pojo)。
在Netty 4.0.0中,它允許我們僅使用DatagramPacket類來發送UDP數據包。
該類只接受ByteBuf作爲參數。Netty 4.x.x中的UDP廣播

有沒有其他辦法,我們可以通過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 interfaces.We試圖如下播出這個POJO:

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

在接收端,我們的初始化部分和上面一樣。但是,在處理程序中獲得了Po喬如下:

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

這是用網狀3.5.x的

如何使用了Netty 4.0.0複製這種情況下成功完成。請向我們提供示例代碼。

+0

嗨,我面臨同樣的問題。你能幫我,因爲我也在Netty 4.0.0中實現它。 – Shamse

回答

1

我想你可能只是有一個MessageToMessageDecoder/MessageToMessageEncoder,它會將DatagramPacket編碼/解碼爲一個ByteBuf,實際上它只不過是調用DatagramPacket.data()來解碼(就像例子)。在編碼器/解碼器之後,您可以添加通常的其他ChannelHandler,將處理ByteBuf解碼爲Pojo。

+0

我在4.0.0.CR5上試了這個,我在ChannelHandler中出現了一個問題:'io.netty.util.IllegalReferenceCountException:refCnt:0'。我正在使用一個'MessageToMessageDecoder '解碼函數只包含'out.add(msg.content());' - 任何想法我失蹤?下一個ChannelHandler只是一個'LengthFieldBasedFrameDecoder' ... –

+0

Nevermind,只是發現解碼需要一個'msg.retain()'調用。作品!這是我的示例PoC:https://gist.github.com/adamrofer/5809753 –