分割符和定長解碼器的應用

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

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