netty--粘包、半包解决方案

闲着没事研究了一下netty怎么用。如有错误,还请指正。

在数据传输的过程中,TCP协议会将多个较小的数据包放在一起传输,或者是将数据拆分进行传输,这就导致在更上层需要进行判断收到是否为一个完整的数据包,否则进行就没办法玩了。下面列举几个常用的方案。

一、强制每个数据包单独发送

通过设置参数,强制要求不进行合并和拆包发送,简单粗暴,两行代码搞定问题。但是这样因为每次传送的数据较少,在频繁通信的时候会导致网络拥堵,不推荐使用。

服务端配置:

                    // 强制要求,每次只发送一条信息
                    .childOption(ChannelOption.TCP_NODELAY, true)

客户端配置:

                     // 强制要求,每次只发送一条信息
                     .option(ChannelOption.TCP_NODELAY, true);

二、将数据以固定的大小进行发送

每次发送固定长度的数据,然后在接收的时候,以设定好的长度去读取数据即可。这样同样存在问题:如果每次发送的数据实际长度很短就浪费了网络流量;并且这样也限制了发送的数据的最大长度。

netty对此方案提供了对应的解码器:FixedLengthFrameDecoder

三、通过固定的分隔符进行判断

很简单,在数据发送的结尾以固定的字符作为判断,标记到达了数据包的末尾。

netty对此方案提供的解码器:DelimiterBasedFrameDecoder

四、通过在数据包的头部写入长度数据判断收到数据的长度

事先规定好长度字段,在发送数据的时候将数据长度写入对应的位置,然后接收数据的时候根据长度字段读取对应的数据即可。推荐使用

netty对此方案提供的编码器:LengthFieldPrepender,解码器:LengthFieldBasedFrameDecoder

需要注意的就是,在进行数据的解码的时候,解码器收到数据是包含长度数据的,所以需要将长度数据删除再进行解码,不然会出问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值