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)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值