zoukankan      html  css  js  c++  java
  • 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());
        }
    
  • 相关阅读:
    为什么重写equals还要重写hashcode?
    谈谈关于Synchronized和lock
    springBoot为啥没有没有web.xml了
    springBoot整合mybatis开发
    springBoot的介绍与搭建
    Java i++原理及i=i++的问题说明
    Django学习笔记〇三——APP以及的文件结构
    Django学习笔记〇二——第一个Django项目
    Django学习笔记〇一——从web的概念引入
    MySQL学习笔记——〇六SQLAlchemy框架
  • 原文地址:https://www.cnblogs.com/monkjavaer/p/11215837.html
Copyright © 2011-2022 走看看