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會按照固定長度對消息自動編碼解碼。如果是半包消息,他會緩存半包消息並等待下一個包到達之後進行拼包,知道讀取到一個完整的包。