【Netty】02-netty中不得不说的粘包与拆包
时间:2022-07-25
本文章向大家介绍【Netty】02-netty中不得不说的粘包与拆包,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
netty不得不说的粘包与拆包
为什么会出现粘包和拆包的现象呢?
第一个要素为长连接,一个长连接可以发送多个消息
第二个要素为缓冲区。当我们采用了缓冲区以后,缓冲区会有固定大小,当发送的数据和缓冲区的大小不一致时,就会发生粘包和拆包。我们可以理解为:当缓冲区的大小被装满时,才会写入到硬盘
缓冲区
提到粘包与拆包,我们需要先做一些铺垫,了解一下缓冲区的作用
我们先来看一张图解:
Client发送数据,如果没有缓冲区,采用的是IO流。IO流传输是按照字节进行传输的,效率极低。当我们改为缓冲区以后,我们可以把消息存到一起,一并发送
比如说:“今天你过的还好吗”这样一组字符串要传输8次,效率就很低,所以,我们采用Buffer缓冲区进行传输,统一放入缓冲区内,再一次性写入。效率就提高了
粘包与拆包图解
粘包:
我们第一次发送的数据只有512,不够缓冲区大小,所以缓冲区不会进行写入操作,当我们发送第二次数据又有512,两次加起来刚好满足缓冲区大小,则进行写入操作。即为粘包操作
当我们发送的数据大于缓冲区的大小,缓冲区装不下了,所以会分成两次写入,所以,拆包也就随之发生了
如何解决粘包和拆包问题
- 以固定的长度发送数据,到缓冲区(rpc远程调用,长度不能固定) 采用/n来做分割,读取的时候,把获取的消息按照n分割
- 添加分隔符(n或者rn)
- 添加编码器和解码器的方式来做(常用),也可以自定义编码器和解码器
ch.pipeline().addLast(new LineBasedFrameDecoder(1024));
ch.pipeline().addLast(new StringEncoder());
- Docker系列教程15-Docker容器网络
- 数据挖掘
- Docker系列教程14-Docker数据持久化
- Docker 学习系列二之基本管理
- Docker系列教程13-Docker可视化管理工具
- Ubuntu 16.04 安装VNC
- 使用Feign实现Form表单提交
- Ubuntu 16.04 Install OpenCV
- Spring Cloud各组件调优参数
- 手把手教你设置 IntelliJ IDEA 的彩色代码主题
- 实用技巧:Hystrix传播ThreadLocal对象(两种方案)
- OpenDaylight与Mininet应用实战之流表操作
- 使用Spring Cloud Feign上传文件
- 用 TensorFlow 让你的机器人唱首原创给你听
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 通过 PHP 原生代码实现 HTTP 路由器
- MySQL组复制(MGR)全解析 Part 10 MGR新增节点
- 基于 gorilla/sessions 在 Go 语言中管理 Session
- 通过 PHP 原生代码实现 HTTP 控制器
- Go 视图模板篇(一):模板引擎的定义、解析与执行
- Mycat分库分表全解析 Part 6 Mycat 全局序列号
- 通过 PHP 原生代码实现视图模板引擎的解析和渲染
- [MySQL故障处理]记一次innobackupex导致的从库无法同步的问题
- [Oracle 故障处理]记一次DG数据文件无法创建的问题
- mysqldump命令详解 4-按条件备份表数据
- mysqldump命令详解 5-导出事件,函数和存储过程
- [Oracle集群软件全解析]Oracle Cluster Registry Utility 参考
- mysqldump命令详解 Part 8 其他的一些的参数的介绍
- mysqldump命令详解 Part 6- --master-data参数的使用
- 腾讯云语音识别.net-sdk使用笔记0818