一、前言

在客户端与服务端进行通信时候都会约定一个通讯协议,协议一般包含一个header和body,一个header和body组成了一次通讯的内容,一个通讯包。正常情况下客户端通过socket发送一个请求包后,服务端接受后解析请求包,然后进行处理,这看似是一个很简单的问题,但当客户端连续发送多个请求包时就可能会出现半包、粘包现象。

二、什么是粘包与半包问题

在客户端发送数据时,实际是把数据写入到了TCP发送缓存里面的。

如果发送的包的大小比TCP发送缓存的容量大,那么这个数据包就会被分成多个包,通过socket多次发送到服务端,服务端第一次从接受缓存里面获取的数据,实际是整个包的一部分,这时候就产生了半包现象,半包不是说只收到了全包的一半,是说收到了全包的一部分。

如果发送的包的大小比TCP发送缓存容量小,并且TCP缓存可以存放多个包,那么客户端和服务端的一次通信就可能传递了多个包,这时候服务端从接受缓存就可能一下读取了多个包,这时候就出现了粘包现象。

服务端从接受缓存读取数据后一般都是进行解码操作,也就是会把byte流转换了pojo对象,如果出现了粘包或者半包现象,则进行转换时候就会出现异常。

出现粘包和半包的原因是TCP层不知道上层业务的包的概念,它只是简单的传递流,所以需要上层应用层协议来识别读取的数据是不是一个完整的包。

三、如何避免

  • 比较常见方案是应用层设计协议时候协议包分为header和body,header里面记录body长度,当服务端从接受缓冲区读取数据后,如果发现数据大小小于包的长度则说明出现了半包,这时候就回退读取缓存的指针,等待下次读事件到来的时候再次测试。如果发现包长度大于了包长度则看长度是包大小整数倍则说明了出现了粘包,则循环读取多个包,否者就是出现了多个整包+半包。

  • 多个包之间添加分隔符。

  • 包定长,每个包大小固定长度。

    四、总结

    本文介绍了网络通讯中粘包和半包的概念,出现原因,以及常用的应对策略。最后想学系统学习Java并发的童鞋可以 单击下方  阅读原文

Dubbo剖析-Netty粘包与半包问题(一)相关推荐

  1. Dubbo剖析-粘包与半包问题(一)

    一.前言 在客户端与服务端进行通信时候都会约定一个通讯协议,协议一般包含一个header和body,一个header和body组成了一次通讯的内容,一个通讯包.正常情况下客户端通过socket发送一个 ...

  2. Java NIO 框架 Netty 之美:粘包与半包问题

    Netty 是一个可以快速开发网络应用程序的 NIO 框架,它大大简化了 TCP 或者 UDP 服务器的网络编程.Netty 的简易和快速开发并不意味着由它开发的程序将失去可维护性或者存在性能问题,它 ...

  3. netty半包粘包 处理_Java NIO 框架 Netty 之美:粘包与半包问题

    一.前言 Netty 是一个可以快速开发网络应用程序的 NIO 框架,它大大简化了 TCP 或者 UDP 服务器的网络编程.Netty 的简易和快速开发并不意味着由它开发的程序将失去可维护性或者存在性 ...

  4. TCP 粘包、半包 Netty 全搞定

    什么是粘包和半包? 粘包的主要原因: • 发送方每次写入数据 < 套接字缓冲区大小 • 接收方读取套接字缓冲区数据不够及时 半包的主要原因: • 发送方写入数据 > 套接字缓冲区大小 • ...

  5. Netty——ByteBuffer(ByteBuffer消息粘包、半包示例)

    目录 一. ByteBuffer消息粘包.消息半包的概述 二.示例需求 三.示例代码 一. ByteBuffer消息粘包.消息半包的概述 NIO是面向缓冲区进行通信的,不是面向流的.既然是缓冲区,那它 ...

  6. 透过现象看本质,我找到了Netty粘包与半包的这几种解决方案

    1.粘包与半包 啥也不说了,直接上代码是不是有点不太友好,我所谓了,都快过年了,还要啥自行车 我上来就是一段代码猛如虎 1.1 服务器代码 public class StudyServer {stat ...

  7. 透过现象看本质,我找到了Netty粘包与半包的这几种解决方案。

    1.粘包与半包 啥也不说了,直接上代码是不是有点不太友好,我所谓了,都快过年了,还要啥自行车 我上来就是一段代码猛如虎 1.1 服务器代码 public class StudyServer {stat ...

  8. Netty - 粘包和半包(上)

    在网络传输中,粘包和半包应该是最常出现的问题,作为 Java 中最常使用的 NIO 网络框架 Netty,它又是如何解决的呢?今天就让我们来看看. 定义 TCP 传输中,客户端发送数据,实际是把数据写 ...

  9. netty中的粘包和半包

    在网络传输中,粘包和半包应该是最常出现的问题,作为 Java 中最常使用的 NIO 网络框架 Netty,它又是如何解决的呢?今天就让我们来看看. 一.定义 TCP 传输中,客户端发送数据,实际是把数 ...

最新文章

  1. 2018-4-8模拟退火算法
  2. linux搜索有哪些文件夹,Linux常见几个查找命令
  3. python取中间值的函数_tensorflow实现在函数中用tf.Print输出中间值
  4. Shell之系统函数和自定义函数
  5. html 动态调用php文件,html静态页面调用php文件的方法
  6. 如何上传文件及文件夹到IPFS
  7. 传递参数安全验证代码示例
  8. php重写mysql类_如何成功重写旧的mysql-php代码与已弃用的mysql_ *函数?
  9. POJ-1191 棋盘分割 记忆化搜索
  10. 2021-1016-复盘 强势股-风口综合实战
  11. 女版乔布斯的覆灭,这是今年我听过最唏嘘的真人故事
  12. 英语写作翻译-形容词(一)
  13. MMpose代码讲解之关键点Heatmap可视化
  14. axis调用java实现webservice实例
  15. 便签 java_基于安卓Android的便签笔记APP设计(Android studio)
  16. 一文搞懂大数据开发,大数据开发体系详解
  17. Redis集群(Cluster)
  18. echarts 绘制中国地图(中英文转换)
  19. 计算机软件著作权登记证书申请流程有哪些
  20. Java数组(超详细!)

热门文章

  1. 基于贝叶斯分类器进行sklearn乳腺癌数据集的分类
  2. 域名解析记录类型的作用与区别
  3. win10 安装.net3.5失败,错误代码0x800f0922
  4. 建站就用这个方法,无需购买服务器10分钟快速部署你的静态网页
  5. Linx配置IP地址及网络相关
  6. 儿童B2C网站项目策划书
  7. 分析Ajax请求并爬取下载今日头条街拍美图
  8. 【Elasticsearch】ES正确查询文档数不要使用_search的hit而是使用_count
  9. 128元起步的5G套餐算贵吗?专家如是说……
  10. 微信自动抢红包android实现