首页 > Web开发 > 详细

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

时间:2019-07-19 22:14:59      阅读:97      评论:0      收藏:0      [点我收藏+]

解码器Decoder和ChannelHandler的关系

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

  • LineBasedFrameDecoder
  • DelimiterBasedFrameDecoder
  • FixedLengthFrameDecoder

LineBasedFrameDecoder

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

StringDecoder

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

代码中使用

    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        //LineBasedFrameDecoder遍历ByteBuf中的可读字节,按行(\n \r\n)处理
        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());
    }

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

原文:https://www.cnblogs.com/monkjavaer/p/11215837.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!