Netty粘包/拆包支持

在之前的Netty项目中没有考虑半包的问题。一旦压力上来或者发送大的报文就会存在粘包拆包问题。

使用LineBansedFrameDecode解决TCP粘包问题。
直接在调用Handler之前添加LineBasedFrameDecoder和StringDecoder两个解码器即可。

        protected void initChannel(SocketChannel arg0) throws Exception {
           arg0.pipeline().addLast(new LineBasedFrameDecoder(1024));
           arg0.pipeline().addLast(new StringDecoder());
           arg0.pipeline().addLast(new TimeServerHandler());
        }

LineBasedFrameDecoder的工作原理是依次遍历ByteBuf中可读字节,判断是否有“\n”或“\rn”,如果有就为结束位。它是以换行符为结束标示的解码器。
StringDecoder的功能是将接收到的对象装换成字符串。如果使用StringDecoder在channelRead方法中就可以使用String body = (String)msg,直接将传输对象转换成String型。LineBasedFrameDecoder+StirngDecoder组合就是按行切换的文本解码器。

分隔符解码器:
使用方式和上面的基本类似

@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
    ByteBuf delimiter = Unpooled.copiedBuffer("$_".getBytes());
    socketChannel.pipeline().addLast(new DelimiterBasedFrameDecoder(1024, delimiter));
    socketChannel.pipeline().addLast(new StringDecoder());
    socketChannel.pipeline().addLast(new EchoServerHandler());
}

创建以“$_”作为分隔符的缓冲对象。创建DelimiterBasedFrameDecoder对象,参数“1024”表示单条消息的最大长度,如果到达该最长度仍然没有查到分隔符,就抛异常。

固定长度解码器:

@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
    socketChannel.pipeline().addLast(new FixedLengthFrameDecoder(20));
    socketChannel.pipeline().addLast(new StringDecoder());
    socketChannel.pipeline().addLast(new EchoServerHandler());
}

利用FixedLengthFrameDecoder解码器,无论一次收到多少数据报,他都会按照构造函数中的固定长度进行解码。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值