文章目录

  • 为什么要处理粘包
  • 处理粘包的方法
  • 总结

为什么要处理粘包

由于tcp协议是数据流传输,一次读数据不一定能得到一个完整的业务数据包,所以需要进行粘包处理,保证要处理的数据是一个或者多个完成的业务数据包。

处理粘包的方法

假设:

  • 包的格式为 四字节包头 + 包体, 包头指明包体的长度
  • 大端传输数据

处理过程:

  • 先读取四字节包头,解析出包头的长度bodyLen
  • 再读取bodyLen长度的包体,这次读取的数据就是一个完整的业务包bodyData
  • 把bodyData返回到业务层处理

处理代码如下:

const (MAX_CONN_TIMEOUT = 30PACKET_HEAD_LEN  = 4
)func Recv(conn net.Conn) ([]byte, error) {//读取包头head := make([]byte, PACKET_HEAD_LEN)_ = c.Conn.SetReadDeadline(time.Now().Add(time.Second * MAX_CONN_TIMEOUT))_, err := io.ReadFull(conn, head)if nil != err {log.Error("io.ReadFull() failed, error[%s]", err.Error())return nil, err}bodyLen := binary.BigEndian.Uint32(head) //读取包体bodyData := make([]byte, bodyLen)_ = c.Conn.SetReadDeadline(time.Now().Add(time.Second * MAX_CONN_TIMEOUT))_, err = io.ReadFull(conn, bodyData)if nil != err {log.Error("io.ReadFull() failed, error[%s]", err.Error())return nil, err}return bodyData, nil
}

总结

  • 每调用一次Recv函数就可以得到一个完整的业务包,返回到业务层进行处理
  • 代码中设置了超时时间,这个根据实际业务需要来设置,有些业务场景不设置也可以。如果不设置,那么读不够数据就会一直阻塞在那里。关于设置的超时时间的大小,也是根据实际业务场景,比如有的客户端与服务端之间是10秒一次心跳,那么超时时间设置就要大于10秒,比如20秒或者30秒等等。
  • Recv返回后,应当判断error是否为nil,进行错误处理,比如可能网络出错需要重新连接。

Golang中如何处理tcp粘包相关推荐

  1. Qt中对TCP粘包的处理

    当时用TCP协议传输数据时,经常出现粘包的现象 当服务器向客户端发送数据之后,客户端还没有接收数据的时候,这段时间数据在什么地方? 1.服务器?服务器已经发出数据了 2.网线?数据应该在内存,怎么会在 ...

  2. Socket编程(4)TCP粘包问题及解决方案

    ① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...

  3. 6行代码解决golang TCP粘包

    什么是TCP粘包问题以及为什么会产生TCP粘包,本文不加讨论.本文使用golang的bufio.Scanner来实现自定义协议解包. 协议数据包定义 本文模拟一个日志服务器,该服务器接收客户端传到的数 ...

  4. golang 解决 TCP 粘包问题

    什么是 TCP 粘包问题以及为什么会产生 TCP 粘包,本文不加讨论.本文使用 golang 的 bufio.Scanner 来实现自定义协议解包. 协议数据包定义 本文模拟一个日志服务器,该服务器接 ...

  5. golang解决TCP粘包问题

    6行代码解决golang TCP粘包 转自:https://studygolang.com/articles/12483 什么是TCP粘包问题以及为什么会产生TCP粘包,本文不加讨论.本文使用gola ...

  6. TCP粘包是什么?如何处理?UDP有粘包吗?

    文章目录 1.什么是TCP粘包 2.出现粘包的原因 3.粘包的处理 - 什么时候需要处理 - 如何处理 4.UDP没有粘包 1.什么是TCP粘包 TCP粘包就是指发送方发送的若干包数据到达接收方时粘成 ...

  7. 网络:TCP粘包问题?如何解决?

    看面经时,看到有面试官问TCP的粘包问题.想起来研一做购物车处理数据更新时遇到粘包问题,就总结一下吧. 1 什么是粘包现象 TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看, ...

  8. TCP粘包问题分析和解决(全)

    TCP通信粘包问题分析和解决(全) 在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送 ...

  9. 什么是TCP粘包?为什么UDP没有粘包?

    前言 在socket网络编程中,都是端到端通信,由客户端端口+服务端端口+客户端IP+服务端IP+传输协议组成的五元组可以明确的标识一条连接.在TCP的socket编程中,发送端和接收端都有成对的so ...

  10. TCP粘包:我只是犯了每个数据包都会犯的错 |硬核图解

    事情从一个健身教练说起吧. 李东,自称亚健康终结者,尝试使用互联网+的模式拓展自己的业务.在某款新开发的聊天软件琛琛上发布广告. 键盘说来就来.疯狂发送"李东",回车发送!,&qu ...

最新文章

  1. python自然语言处理.词性标注
  2. Java 设计模式之工厂模式
  3. OS_CORE.C(8)
  4. js判断对象还是数组
  5. 【Python成长之路】从零做网站开发 -- 下拉选择项的实现
  6. 【图像检测】基于matlab GUI比值+归一化+相关系数遥感图像【含Matlab源码 737期】
  7. 侙程序错误怎么找c语言,log4j 施用 - 汉字转换成拼音的种(转) - 遏止EditText弹出输入法_169IT.COM...
  8. 输入输入是否为回文(如“abcba”和”123321”都是回文)。(c语言)
  9. 什么是浏览器指纹,如何完整修改浏览器指纹?
  10. 微信开发平台和微信公众平台绑定
  11. python打印九九乘法表上三角_用Python打印九九乘法表正三角和倒三角。
  12. 给女朋友写一个微信小程序
  13. 网络 DMZ 区和网络安全等级简介
  14. 以大TMS运输配送管理系统
  15. 《神奇的数学》读后感_数学王国_奇妙的数学王国读后感10篇
  16. 计算机管理无法打开权限不足,win10 打不开软件管理员权限不够
  17. 五角星符号怎么打出来
  18. 4 ARM PEG20K MAL
  19. 如何防护 DDoS 攻击?
  20. GNU LGPL协议

热门文章

  1. C#之CAD二次开发: Ribbon界面初探
  2. Windows DOS命令总结大全
  3. kettle软件的使用
  4. MyEclipse使用阿里p3c代码规范
  5. python实现类似于visio_Visio类似的高性价比的替代软件
  6. 达梦数据库SQL语句执行
  7. 使用Android Studio导入源码
  8. Adobe完全卸载工具
  9. Python 写入文件
  10. Java主流框架的介绍