• Netty使用解码器Decoder解决TCP粘包和拆包问题


    解码器Decoder和ChannelHandler的关系

    netty的解码器通常是继承自ByteToMessageDecoder,而它又是继承自ChannelInboundHandlerAdapter,其实也是一种ChannelHandler和我们自定义的ChannelHandler一样都是来处理进入或者出去的数据。常用的几种解码器有:

    • LineBasedFrameDecoder
    • DelimiterBasedFrameDecoder
    • FixedLengthFrameDecoder

    LineBasedFrameDecoder

    LineBasedFrameDecoder 行解码器,遍历ByteBuf中的可读字节,按行( )处理

    StringDecoder

    StringDecoder将接受的码流转换为字符串

    代码中使用

        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
            ChannelPipeline pipeline = ch.pipeline();
            //LineBasedFrameDecoder遍历ByteBuf中的可读字节,按行(
     
    )处理
            pipeline.addLast(new LineBasedFrameDecoder(1024));
            //StringDecoder将接受的码流转换为字符串
            pipeline.addLast(new StringDecoder());
            pipeline.addLast(new NettyServerHandler());
        }
    

    NettyServerHandler处理类中读取,String message = (String) msg;直接转换为String:

        private int count = 0;
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
            String message = (String) msg;
            LOGGER.info("client received message {}:{}", ++count, message);
        }
    

    DelimiterBasedFrameDecoder

    DelimiterBasedFrameDecoder,将特定分隔符作为码流结束标志的解码器。

    代码中使用

        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
            ChannelPipeline pipeline = ch.pipeline();
            ByteBuf byteBuf = Unpooled.copiedBuffer("$_".getBytes());
            pipeline.addLast(new DelimiterBasedFrameDecoder(1024,true,true,byteBuf));
            pipeline.addLast(new StringDecoder());
            pipeline.addLast(new NettyServerHandler());
        }
    

    FixedLengthFrameDecoder

    FixedLengthFrameDecoder 固定长度解码器,只会读取指定长度的码流。

    代码中使用

        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
            ChannelPipeline pipeline = ch.pipeline();
            pipeline.addLast(new FixedLengthFrameDecoder(24));
            pipeline.addLast(new StringDecoder());
            pipeline.addLast(new NettyServerHandler());
        }
    
  • 相关阅读:
    联赛前第七阶段总结
    tomcat启动服务一会后自动关闭
    删除软件服务
    jmeter ramp-up解释
    mysql数据库报错1045
    tomcat在linux上的安装
    ant在linux下的安装部署
    查看一条mysql语句的性能
    linux下安装svn服务器
    InfluxDB数据库报错ERR: unable to parse authentication credentials Warning: It is possible this error is due to not setting a database. Please set a database with the command "use <database>".
  • 原文地址:https://www.cnblogs.com/monkjavaer/p/11215837.html
Copyright © 2020-2023  润新知