我在为TCP Netty客户端编码FrameDecoder.decode()时遇到问题。

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


在上面的签名中,缓冲区应该包含需要成帧的字节。但是,为什么必须返回对象?我知道,如果返回的对象为null,则表明该缓冲区需要更多数据,但是如果我返回其中有部分帧的一些未读字节的缓冲区,会发生什么情况呢?是否会在添加更多字节的情况下调用它?

假设decode()的给定调用具有一个包含100个字节的缓冲区。在这100个中,有2个25和55字节的完整帧和20字节的部分帧。我能否只读取第一个完整帧(25个字节)并返回缓冲区(其中包含75个字节-1个完整帧(55个字节)和另外20个字节的部分帧)?这会在下次调用解码时导致任何字节被覆盖吗?还是可以在下一次调用中读取下一帧(55字节)?

最佳答案

每个解码调用将返回一帧。 FrameDecoder将继续读取和转发读取的帧,直到您返回null。保存在FrameDecoder中的字节将被保存,一旦接收到新的ChannelBuffer,两个字节将被合并,并且FrameDecoders的encode(..)方法将再次被调用。

关于java - Netty FrameDecoder.decode的最佳编码方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10985040/

10-10 09:39