DelimiterBasedFrameDecoder 分隔符解码器
FixedLengthFrameDecoder 定长解码器
使用也非常简单,只需要加到Handler里面去就可以了
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 100)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel channel) {
ByteBuf delimiter = Unpooled.copiedBuffer("$_".getBytes());
// 试试看:注释掉下面这句
channel.pipeline().addLast(new DelimiterBasedFrameDecoder(1024, delimiter));
channel.pipeline().addLast(new StringDecoder());
channel.pipeline().addLast(new EchoServerHandler());
}
});
如此一来,服务器端就会按照$_字符去分割接受的字符串。这就是分隔符解码器的用法
下面是定长解码器
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 100)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel channel) {
channel.pipeline().addLast(new FixedLengthFrameDecoder(20));
channel.pipeline().addLast(new StringDecoder());
channel.pipeline().addLast(new EchoServerHandler());
}
});
FixedLengthFrameDecoder会按照固定长度对消息自动编码解码。如果是半包消息,他会缓存半包消息并等待下一个包到达之后进行拼包,知道读取到一个完整的包。