分割符和定长解码器的应用

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会按照固定长度对消息自动编码解码。如果是半包消息,他会缓存半包消息并等待下一个包到达之后进行拼包,知道读取到一个完整的包。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章