我正在扩展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...
}
}
中的更多内容
答案 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
,直到它读取更多内容为止。并重复,直到您有足够的数据来构建您的消息。