Netty聊天系统(2)粘包和半包问题的解决

本文讨论了TCP粘包和拆包的概念,解释了Netty如何处理这个问题。通过携带消息长度来区分消息边界,介绍了Netty提供的固定长度、行、分隔符和基于长度域的拆包器,提供了具体的解决方案。
摘要由CSDN通过智能技术生成

4 粘包和半包问题的解决

什么是TCP粘包和拆包

1)TCP是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样做虽然提高了效率,但是接收端就难于分辨出完整的数据包了,因为面向流的通信是无消息保护边界的。

由于TCP无消息保护边界,需要在接收端处理消息边界问题,也就是我们所说的粘包、拆包问题。

虽然我们在应用层使用了Netty,但是网络数据的传输还是经过TCP协议,操作系统仍然按照字节流方式传输而不是ByteBuf,接收方需要将输入流重新拼接成ByteBuf。

2)通常的解决方案是:发送端每发送一次消息,就需要在消息的内容之前携带消息的长度,这样,接收方每次先接受消息的长度,再根据长度去读取该消息剩余的内容。如果socket中还有没有读取的内容,也只能放在下一次读取事件中进行。

TCP粘包示例

客户端连续发送数据较小的数据

public class MyClientHandler extends SimpleChannelInboundHandler<ByteBuf> {
   
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值