2012-06-11 48 views
0

我遇到了編碼FrameDecoder.decode()爲tcp netty客戶端的問題。最好的方式來編碼Netty FrameDecoder.decode

protected Object decode(ChannelHandlerContext ctx, Channel channel, 
     ChannelBuffer buffer) throws Exception { 

在上面的簽名中,緩衝區應該包含需要加框的字節。但那爲什麼要退回?我知道如果返回的對象爲null,這表明需要更多的數據到這個緩衝區,但是如果我返回一個帶有部分幀的未讀字節的緩衝區,會發生什麼?這會被調用更多的字節添加?

假設給定的調用decode()有一個100字節的緩衝區。在這100箇中,有2個25和55字節的完整幀和20個字節的部分幀。我能讀取第一個完整幀(25字節)並返回緩衝區(其中75字節 - 55個字節的1個完整幀和另一個部分幀的20個字節)?這會在下次調用解碼時導致任何字節被覆蓋嗎?或者在下一次調用中讀取下一個幀(55字節)是否可以?

回答

1

每解碼一次,您將返回一幀。 FrameDecoder將繼續讀取和轉發讀取幀,直到您返回null。 FrameDecoder中保留的字節將被保存,一旦接收到新的ChannelBuffer,兩者將被合併,FrameDecoders解碼(..)方法將再次被調用。

+0

能否請您參考我的100字節緩衝區案例解釋一下: 1.是否需要返回幀?我的意思是我不能簡單地獲取幀的字節並調用回調,將這些字節傳遞給回調函數? \t ChannelBuffer frame = buffer.readBytes(length); //長度是幀中的字節數 \t callback.invoke(frame) \t 2.如果我讀取25個字節的第一幀,那麼下一個調用是否包含剩餘的兩個幀以供讀取?還是會導致數據的腐敗? – Bhaskar