什么是粘包和半包?

粘包的主要原因:

• 发送方每次写入数据 < 套接字缓冲区大小

• 接收方读取套接字缓冲区数据不够及时

半包的主要原因:

• 发送方写入数据 > 套接字缓冲区大小

• 发送的数据大于协议的 MTU(Maximum Transmission Unit,最大传输单元),必须拆包

为什么 TCP 应用中会出现粘包和半包现象?

根本原因:

TCP 是流式协议,消息无边界。

提醒:UDP 像邮寄的包裹,虽然一次运输多个,但每个包裹都有“界限”,一个一个签收,

所以无粘包、半包问题。

解决粘包和半包问题的几种常用方法

解决问题的根本手段:找出消息的边界

Netty 对三种常用封帧方式的支持

实战中使用 protobuf 协议系列化:

protobuf是google序列化的工具,主要是把数据序列化成二进制的数据来传输用的。它主要优点如下:

1.性能好,效率高;

2.跨语言(java自带的序列化,不能跨语言)

其实,在netty中使用Protobuf需要注意的是:

protobufDecoder仅仅负责编码,并不支持读半包,所以在之前,一定要有读半包的处理器。

有三种方式可以选择

使用netty提供ProtobufVarint32FrameDecoder

继承netty提供的通用半包处理器 LengthFieldBasedFrameDecoder

继承ByteToMessageDecoder类,自己处理半包

解读 Netty 处理粘包、半包的源码

• 一次解码器:ByteToMessageDecoder

• io.netty.buffer.ByteBuf (原始数据流)-> io.netty.buffer.ByteBuf (用户数据)

• 二次解码器:MessageToMessageDecoder<I>

• io.netty.buffer.ByteBuf (用户数据)-> Java Object

选择编解码方式的要点

TCP 粘包、半包 Netty 全搞定相关推荐

  1. TCP 粘包半包 netty 编解码 三者关系

    1 何为粘包 / 半包? 对方一次性接收了多条消息这种现象,我们就称之为 粘包现象. 对方多次接收了不完整消息这种现象,我们就称之为 半包现象. 粘包的原因: 发送方发送的消息 < 缓冲区大小 ...

  2. Netty框架之TCP粘包/半包解决方案

    Netty框架之TCP粘包/半包解决方案 一.TCP粘包 二.TCP半包 三.TCP粘包/半包解决方案 1.FixedLengthFrameDecoder定长解析器 2.LineBasedFrameD ...

  3. 三、Netty的粘包半包问题解决

    一.定义 TCP 传输中,客户端发送数据,实际是把数据写入到了 TCP 的缓存中,粘包和半包也就会在此时产生.客户端给服务端发送了两条消息ABC和DEF,服务端这边的接收会有多少种情况呢?有可能是一次 ...

  4. Netty粘包/半包问题解析

    目录 一.什么是粘包/半包问题 二.TCP粘包/半包发生的原因 三.粘包/半包解决办法 四.Netty中粘包/半包解决示例 1. 采用固定长度数据包编解码方式 2. 采用特殊字符作为边界字符编解码方式 ...

  5. Netty如何解决粘包半包问题

    何为粘包 / 半包? 比如,我们发送两条消息:ABC 和 DEF,那么对方收到的就一定是 ABC 和 DEF 吗? 不一定,对方可能一次就把两条消息接收完了,即 ABCDEF:也可能分成了好多次,比如 ...

  6. 网络:什么是TCP粘包/半包?怎么解决这个问题

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

  7. netty——黏包半包的解决方案、滑动窗口的概念

    黏包半包 滑动窗口 在深入理解黏包半包问题之前,先了解TCP的一个知识点--滑动窗口 我们都指定tcp是一种可靠的传输协议,这主要是因为在tcp中客户端给服务器端发送一条消息,要等待服务器端的应答,如 ...

  8. websocket是否需要处理粘包半包问题分析

    结论: ​ 不需要. 背景: ​ 公司通信涉及到websocket相关,我们都知道websocket是基于tcp的,而tcp是面向字节流的,是需要处理粘包半包问题的.那么websocket是否需要处理 ...

  9. android+延迟拍摄,延时摄影很难吗? iphone拍+后期全搞定

    手机也能拍出大片,还是目前高端大气的延时摄影,这听起来有点儿不可思议!但如果你的智能手机支持延时摄影拍摄,你还真可以用手机拍大片,甚至说后期都全靠手机来制作.不信你且看我娓娓道来. 在生物演变.天体运 ...

最新文章

  1. linux命令grep如何使用,Linux下如何使用grep搜索文本
  2. python太阳花的编程_python大佬养成计划----HTML DOM
  3. python打开一个文件夹下所有txt文件-python读取一个目录下所有txt里面的内容方法...
  4. Android组件之Service
  5. linux 修改权限 anyone,linux 进程管理工具
  6. biee mysql_BIEE 11g linux下连接mysql数据源
  7. oracle exp imp
  8. GIS专业核心课程电子教材配套实验数据汇总(持续更新)
  9. flask框架基本使用(2)(响应与重定向)
  10. 监听独立于数据库服务器的配置,解决ORA-12520及ORA-12545错误
  11. python怎么画图表_Python 使用pycha画图表
  12. 毕向东的Java基础视频教程的学习,作为java基础的基础学习视频
  13. 批量修改文件夹名称的一部分字符
  14. HTML知识-CSS部分
  15. Mysql8数据库导到Mysql5数据库,报错Unknown collation: 'utf8mb4_0900_ai_ci'
  16. 负载均衡下的多台tomcat服务器,通过memcache实现session共享
  17. 道道通导航linux升级,道道通导航升级免费版
  18. rvm、Ruby、gem、CocoaPods 的安装使用与卸载
  19. linux虚拟网卡卸载,virbr0虚拟网卡如何卸载?virbr0虚拟网卡的卸载方法
  20. 中小型企业网络规划设计方案_深圳线尚网络:中小型企业网站建设方案包含哪些内容?...

热门文章

  1. 颜色空间直方图matlab,使用Matlab绘制图像的rgb颜色空间和Lab颜色空间分量图和分量直方图 | 学步园...
  2. Mysql-savepoint
  3. php不能header跳转页面,PHP问题:php header方法跳转页面问题
  4. 什么是php 的精华,在用PHP开发中的精华和技巧总结
  5. python 模板注入_SSTI模板注入
  6. mysql ascii ord_MySQL ORD()函数使用实例介绍
  7. java改变实参_java中引用传递问题,在函数中修改引用的指向,会不会影响实参?...
  8. 移动组件到指定坐标_《我的世界》传送石碑组件 史蒂夫表示跑路的日子终于结束了...
  9. centos服务端ftp的搭建_centos下搭建ftp服务器
  10. koa 接口返回数据_node和koa实现数据mock接口