TCP 粘包、半包 Netty 全搞定
什么是粘包和半包?
粘包的主要原因:
• 发送方每次写入数据 < 套接字缓冲区大小
• 接收方读取套接字缓冲区数据不够及时
半包的主要原因:
• 发送方写入数据 > 套接字缓冲区大小
• 发送的数据大于协议的 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 全搞定相关推荐
- TCP 粘包半包 netty 编解码 三者关系
1 何为粘包 / 半包? 对方一次性接收了多条消息这种现象,我们就称之为 粘包现象. 对方多次接收了不完整消息这种现象,我们就称之为 半包现象. 粘包的原因: 发送方发送的消息 < 缓冲区大小 ...
- Netty框架之TCP粘包/半包解决方案
Netty框架之TCP粘包/半包解决方案 一.TCP粘包 二.TCP半包 三.TCP粘包/半包解决方案 1.FixedLengthFrameDecoder定长解析器 2.LineBasedFrameD ...
- 三、Netty的粘包半包问题解决
一.定义 TCP 传输中,客户端发送数据,实际是把数据写入到了 TCP 的缓存中,粘包和半包也就会在此时产生.客户端给服务端发送了两条消息ABC和DEF,服务端这边的接收会有多少种情况呢?有可能是一次 ...
- Netty粘包/半包问题解析
目录 一.什么是粘包/半包问题 二.TCP粘包/半包发生的原因 三.粘包/半包解决办法 四.Netty中粘包/半包解决示例 1. 采用固定长度数据包编解码方式 2. 采用特殊字符作为边界字符编解码方式 ...
- Netty如何解决粘包半包问题
何为粘包 / 半包? 比如,我们发送两条消息:ABC 和 DEF,那么对方收到的就一定是 ABC 和 DEF 吗? 不一定,对方可能一次就把两条消息接收完了,即 ABCDEF:也可能分成了好多次,比如 ...
- 网络:什么是TCP粘包/半包?怎么解决这个问题
在socket网络编程中,都是端到端通信,由客户端端口+服务端端口+客户端IP+服务端IP+传输协议组成的五元组可以明确的标识一条连接.在TCP的socket编程中,发送端和接收端都有成对的socke ...
- netty——黏包半包的解决方案、滑动窗口的概念
黏包半包 滑动窗口 在深入理解黏包半包问题之前,先了解TCP的一个知识点--滑动窗口 我们都指定tcp是一种可靠的传输协议,这主要是因为在tcp中客户端给服务器端发送一条消息,要等待服务器端的应答,如 ...
- websocket是否需要处理粘包半包问题分析
结论: 不需要. 背景: 公司通信涉及到websocket相关,我们都知道websocket是基于tcp的,而tcp是面向字节流的,是需要处理粘包半包问题的.那么websocket是否需要处理 ...
- android+延迟拍摄,延时摄影很难吗? iphone拍+后期全搞定
手机也能拍出大片,还是目前高端大气的延时摄影,这听起来有点儿不可思议!但如果你的智能手机支持延时摄影拍摄,你还真可以用手机拍大片,甚至说后期都全靠手机来制作.不信你且看我娓娓道来. 在生物演变.天体运 ...
最新文章
- linux命令grep如何使用,Linux下如何使用grep搜索文本
- python太阳花的编程_python大佬养成计划----HTML DOM
- python打开一个文件夹下所有txt文件-python读取一个目录下所有txt里面的内容方法...
- Android组件之Service
- linux 修改权限 anyone,linux 进程管理工具
- biee mysql_BIEE 11g linux下连接mysql数据源
- oracle exp imp
- GIS专业核心课程电子教材配套实验数据汇总(持续更新)
- flask框架基本使用(2)(响应与重定向)
- 监听独立于数据库服务器的配置,解决ORA-12520及ORA-12545错误
- python怎么画图表_Python 使用pycha画图表
- 毕向东的Java基础视频教程的学习,作为java基础的基础学习视频
- 批量修改文件夹名称的一部分字符
- HTML知识-CSS部分
- Mysql8数据库导到Mysql5数据库,报错Unknown collation: 'utf8mb4_0900_ai_ci'
- 负载均衡下的多台tomcat服务器,通过memcache实现session共享
- 道道通导航linux升级,道道通导航升级免费版
- rvm、Ruby、gem、CocoaPods 的安装使用与卸载
- linux虚拟网卡卸载,virbr0虚拟网卡如何卸载?virbr0虚拟网卡的卸载方法
- 中小型企业网络规划设计方案_深圳线尚网络:中小型企业网站建设方案包含哪些内容?...
热门文章
- 颜色空间直方图matlab,使用Matlab绘制图像的rgb颜色空间和Lab颜色空间分量图和分量直方图 | 学步园...
- Mysql-savepoint
- php不能header跳转页面,PHP问题:php header方法跳转页面问题
- 什么是php 的精华,在用PHP开发中的精华和技巧总结
- python 模板注入_SSTI模板注入
- mysql ascii ord_MySQL ORD()函数使用实例介绍
- java改变实参_java中引用传递问题,在函数中修改引用的指向,会不会影响实参?...
- 移动组件到指定坐标_《我的世界》传送石碑组件 史蒂夫表示跑路的日子终于结束了...
- centos服务端ftp的搭建_centos下搭建ftp服务器
- koa 接口返回数据_node和koa实现数据mock接口