什么是TCP 粘包
https://blog.csdn.net/weixin_41047704/article/details/85340311
1. TCP粘包的问题根源(个人见解):当一个TCP连接建立后我们的传输都是字节流的形式传输的,收发方不知道实际我们发送的数据流大小,造成发送很多条的消息,在接收端变成了一条消息。
例如 我们协商好收发双方都用1024字节接收数据
client send :hello i'm client ! 18字节
server reveice:hello i'm client !
乍一看好像没什么问题 接着我们换一种方式
client:how are you ! 18字节
client:hello i'm a boy ! 18字节
client:hello ?
我们向服务端续发了三次消息 但服务端看到的消息也许是这样的
server reveice:how are you ! hello i'm a boy ! hello ?
消息粘在一起变成了一条消息
2. 解决粘包也非常简单只需要把我们的消息封装一下 ,对端按照规格拆包即可
简单的封装结构 :
打包:数据长度 + 数据 数据长度占用前4个字节
拆包:先读取4个字节 转换成uint32 得到数据长度,读取长度得到数据
type data struct {
length uint32 //数据长度
data []byte //数据
}
3.不想手动实现的已有现成的仓库
https://github.com/Li-giegie/go-jeans
导入依赖:go get -u github.com/Li-giegie/go-jeans@latest
基础用法 默认消息头占4个字节
创建消息:打包将要发送的数据 返回的buf就是最终打包的数据
buf := go_jeans.Pack([]byte("ping ~"))
消息拆包: 基础用法
对打包的数据拆包 入参是连接对象,返回值 接收的字节、错误
replyBuf,err := go_jeans.Unpack(conn)