GO Tcp终极粘包解决方案,保姆级教程

什么是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)

你可能感兴趣的:(golang,tcp/ip,网络)