Netty介绍与实战(三)之粘包拆包
一、传统NIO架构
step1. 我们传统的nio架构已经解决了多路复用,零拷贝等问题,已经十分优秀了,那为什么我们现在Netty如此火热呢?
1) 首先他使用简单,基本上都是模板化,我们可以更专注业务。具体使用可参考Netty介绍及实战
2)社区活跃,成熟稳定。
3)提供编解码功能,和处理粘包、拆包的功能。
4)替我们修复了NIO的大量bug , 不需要考虑复杂的网络协议。
step2.什么是粘包、拆包?
1)上图我们可以看到,所有的message都会放到我们对应的缓冲区当中。
缓冲区:TCP在接受数据的时候,有一个滑动窗口来控制接受数据的大小,这个滑动窗口你就可以理解为一个缓冲区。
case1:右上第一个消息:当一个消息过大,我们TCP缓冲区放不下了,那就会产生拆包,剩下的message会在下一次请求中传递过来。
case2:右上第二第三条消息:每个message的长度比较小,TCP将多次写入的消息一次性的发送出去。
case3:报文长度大于最大报文长度也会出现拆包。
二、Netty架构
step1.network application framework
step2. Netty server architecture
Step3.一个简单数据接收,响应的流程图
1)一个加密数据传输过来,首先经过我们的handler去找到对应的channel去处理,然后将报文交给解密的handler去解析报文,之后将数据传递给业务端,业务端处理之后,再次将响应报文encode之后传递出去(代码:Netty介绍及实战)。
Step4.netty如何处理粘包,拆包呢?
设想,如果一个数据来了如果我不知道数据的具体长度,我们怎么能精准的拆包呢。
所以我们可以在报文的头部,用一部分字节来去标记整条报文的长度,这样按照长度去读取,这样不就可以精准的获取到原始的每一条报文结构了么。于是Netty也提供了这个方法:
LengthFieldBasedFrameDecoder 它是基于消息头指定消息长度进行粘包拆包处理的。
还有其他不同类型的拆包方法,大家也可以再了解一下。如有错误欢迎指出,共同学习!
Netty介绍与实战(三)之粘包拆包相关推荐
- 一起学Netty(六)之 TCP粘包拆包场景
TCP编程底层都有粘包和拆包机制,因为我们在C/S这种传输模型下,以TCP协议传输的时候,在网络中的byte其实就像是河水,TCP就像一个搬运工,将这流水从一端转送到另一端,这时又分两种情况: 1)如 ...
- netty权威指南学习笔记三——TCP粘包/拆包之粘包现象
TCP是个流协议,流没有一定界限.TCP底层不了解业务,他会根据TCP缓冲区的实际情况进行包划分,在业务上,一个业务完整的包,可能会被TCP底层拆分为多个包进行发送,也可能多个小包组合成一个大的数据包 ...
- Netty(二)——TCP粘包/拆包
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7814644.html 前面讲到:Netty(一)--Netty入门程序 主要内容: TCP粘包/拆包的基础知 ...
- 「 计算机网络 」TCP的粘包拆包问题
「 计算机网络 」TCP的粘包/拆包问题 参考&鸣谢 大病初愈,一分钟看懂TCP粘包拆包 雷小帅 TCP 的粘包拆包以及解决方案 一乐说 文章目录 「 计算机网络 」TCP的粘包/拆包问题 一 ...
- TCP粘包/拆包问题
目录 TCP粘包/拆包 TCP粘包/拆包问题说明 TCP粘包/拆包发生的原因 粘包问题的解决策略 未考虑TCP粘包导致功能异常案例 TimeServer的改造 TimeClient的改造 利用Lin ...
- TCP——粘包/拆包
TCP粘包/拆包 TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想想河里的流水,它们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,它会根 ...
- Netty 粘包 拆包 编码 解码 序列化 介绍
目录: 粘包 & 拆包及解决方案 ByteToMessageDecoder 基于长度编解码器 基于分割符的编解码器 google 的 Protobuf 序列化介绍 其他的 前言 Netty 作 ...
- netty解决TCP粘包/拆包导致的半包读写问题的三种方案
解决方案一:LineBasedFrameDecoder+StringDecoder来解决TCP的粘包/拆包问题 只需要在客户端和服务端加上45.46两行代码并且在发送消息的时候加上换行符即可解决TCP ...
- Netty介绍及实战(二)之IO与NIO和多路复用与零拷贝
Netty介绍及实战(一) 一.Netty到底是什么?什么是多路复用?什么叫做零拷贝? Netty是一个NIO客户端服务器框架,可以快速.轻松地开发协议服务器和客户端等网络应用程序.它极大地简化和简化 ...
最新文章
- SunlightChain 区块链宣言
- 表单实例(判断两次密码是否一致)
- 如何才能学好python编程零基础_Python脚本该怎么学,零基础也可以学好Python编程吗?...
- [云炬商业计划书阅读分享]无水洗车市场推广策划书
- c语言 int转char_c语言的函数指针
- jzoj4019-Path【dp】
- django get和filter方法的几点不同
- html颜色对话框,网页颜色对话框的使用
- 2021年内衣品牌营销传播方案-婧麒+美柚.pdf(附下载链接)
- 像python一样运行js的__main__
- sprintf 详解
- Fast marching on 3D meshes with diffusion distance
- Javascript jquery css 写的简单进度条控件
- python - bs4提取XML/HTML中某个标签下的属性
- 解决OpenCV编译时./bin: error while loading shared libraries: libopencv_highgui.so.3.2: cannot open的问题
- 【SPOJ - DQUERY】D-query【主席树 —— 区间中不同数的个数】
- APP的原型制作流程
- 项目管理案例分析:如何通过黄金圈法则建立共识?
- 100本软件开发最佳书籍排行榜
- 职教云python程序设计答案_智慧职教云课堂APPPython程序设计题目答案