ReplayingDecoder< S >
该抽象类继承自ByteToMessageDecoder
< S > – the state type which is usually an Enum; use Void if state management is unused
出现Raw use of parameterized class 'ReplayingDecoder’警告信息时,是因为没有在后面跟泛型
利用其能够在阻塞I/O中实现非阻塞的解码
ReplayingDecoder和ByteToMessageDecoder的区别
ReplayingDecoder中的decode()和decodeLast()方法使用时可以忽略数据的接收,即可以看做所有的数据都已经接收完毕,你不用去考虑收到的数据是否是可用的.
下面分别使用ByteToMessageDecoder和ReplayingDecoder来实现同样功能的一段代码,代码来自文档
利用ByteToMessageDecoder的实现:
public class IntegerHeaderFrameDecoder extends ByteToMessageDecoder {
@Override
protected void decode(ChannelHandlerContext ctx,
ByteBuf buf, List<Object> out) throws Exception {
//没有足够的数据被接收
if (buf.readableBytes() < 4) {
return;
}
buf.markReaderIndex();
int length = buf.readInt();
if (buf.readableBytes() < length) {
buf.resetReaderIndex();
return;
}
out.add(buf.readBytes(length));
}
}
同样的实现,使用ReplayingDecoder来的更加简单:
public class IntegerHeaderFrameDecoder
extends ReplayingDecoder<Void> {
protected void decode(ChannelHandlerContext ctx,
ByteBuf buf, List<Object> out) throws Exception {
out.add(buf.readBytes(buf.readInt()));
}
}
是不是简单多了?