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());
        }
    
  • 相关阅读:
    Docker的镜像与容器
    【目标检测】YOLOv4中的Mish激活函数
    【深度学习】医学图像分割损失函数简介
    【深度学习】归一化方法
    【机器学习】Bagging与Boosting算法原理小结
    【目标检测】RCNN算法
    【机器学习】误差逆传播算法(反向传播算法)
    【机器学习】解决数据不平衡问题
    【干货总结】| Deep Reinforcement Learning 深度强化学习
    【深度学习】迁移学习Transfer Learning
  • 原文地址:https://www.cnblogs.com/monkjavaer/p/11215837.html
Copyright © 2011-2022 走看看