Netty读取确切的字节数

时间:2017-06-15 16:17:29

标签: java netty

我正在扩展ChannelInboundHandlerAdapter并希望读取确切的字节数。

public class Reader extends ChannelInboundHandlerAdapter{

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg){
        ByteBuf b = (ByteBuf) msg;
        byte size = b.readByte();
        //Now I want to read exactly size bytes from the channel
        //and then again read the number of bytes and read the bytes...
    }

}

问题是我们可能会从ByteBuf读取少于必需的字节。如何阅读Channel

中的更多内容

1 个答案:

答案 0 :(得分:1)

只是为了阅读,您可以使用b.readSlice(size)。 但是,正如您所提到的,缓冲区可能还没有足够的数据用于您的消息。因此,您需要在创建消息之前完全使用数据。对于这种情况,我建议您使用内置的ByteToMessageDecoder处理程序。它将为您处理低级字节。因此,对于ByteToMessageDecoder,您的代码将如下所示:

class Reader extends ByteToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        byte size = in.readByte();
        if (in.readableBytes() < size) {
           in.resetReaderIndex();
           return;
        }

        ByteBuf bb = in.readSlice(size);
        //make whatever you want with bb
        Message message = ...; 
        out.add(message);
    }
}

因此,在此示例中,您将读取需要为消息读取的字节数 - size。然后检查您的in缓冲区是否有足够的数据可供使用。如果不是 - 您将控制权返回ByteToMessageDecoder,直到它读取更多内容为止。并重复,直到您有足够的数据来构建您的消息。