0

我在为 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 个字节)吗?

4

1 回答 1

1

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

于 2012-06-11T17:59:05.150 回答