解决tcp粘包和半包的问题

此文章为博主还是小白时,遇到的问题,总结一下:

正常情况下,包都是完整的一个一个的。但是由于一些网络的问题,可能有些出入(毕竟,网络有点不可控),大致分为以下三种:

  1. 一种是正常的字符串输出。
  2. 一种是多个字符串“粘”在了一起,我们定义这种 ByteBuf 为粘包。
  3. 一种是一个字符串被“拆”开,形成一个破碎的包,我们定义这种 ByteBuf 为半包。

 常见的例子就是:正常包体:"我是程序包,我是程序包,我是程序包",粘包的话:"我是程序包我是程序包",半包是:"我是程序包我?(乱码符号)包"。

解决思路:

问题有点难以避免,就谈谈解决方式吧。分辨这个包是否完整再处理就变得尤为重要,那么我们可以提前说明包的必要属性。设计大抵是:包头+包体(+分隔符)。包头:声明包的必要属性,长度,协议id,ip,版本号之类的。包体即是内容。分隔符,用于分割包(因为可以通过包头长度,可自己考虑用不用)

解决方法:

在接收信息的时候,建立一个缓冲区,用于分割粘包和半包,将整个包处理,半个包的缓存下来等待凑成整个再处理。

猜你喜欢

转载自blog.csdn.net/qq_36542426/article/details/106361612