采用netty这个类库写的tcp server如何从网络上发的字节流中切包呢?这个问题netty已经有所考虑,而且已经提供了用来切包的类,本文就记录一下netty中如何切包。
目录
1、切包的含义
2、netty-server的架构
3、netty中切包的类
1、切包的含义
切包指的是从字节流中识别出一个一个的数据包。因为网上发来的是一个字节一个字节的流式数据,类似于下图
那么,如何从这个字节流中找出哪些字节是组成一个数据包的字节呢?就是如何将字节流切成一个一个数据包呢?这就是切包问题。
2、netty-server的架构
一个基于tcp协议的网络协议服务端主要包括3个部分,分别是切包、编解码和业务处理,如下图所示:
在这个架构中,第一步就是切包,只有从字节流中切出了包,才能对这个包做编解码,做了编解码这个包才变成了应用层可以理解的包,因此,才能做最后一步的业务处理。
当然,切包也是为了解决tcp的拆包和粘包问题的,netty-server这一层有了切包功能,tcp的拆包和粘包自然被解决了,就根本不会对应用层造成任何困扰。
3、netty中切包的类
netty中将切包叫做编解码,netty认为切包是一种编解码,所以切包在netty中不叫切包,而叫编解码。
Netty提供了4种切包类,分别如下:
编号 | 切包器名称 | 类名 | 功能 |
---|---|---|---|
1 | 固定长度的切包器 | FixedLengthFrameDecoder | 每个应用层数据包的都拆分成都是固定长度的大小,这样读取字节流的时候就将读取的一个固定大小的字节块认为是一个包。 |
2 | 行切包器 | LineBasedFrameDecoder | 每个应用层数据包,都以换行符作为分隔符,进行切分。 |
3 | 基于分隔符的切包器 | DelimiterBasedFrameDecoder | 每个应用层数据包,都通过自定义的分隔符,进行切分。 |
4 | 基于数据包长度的切包器 | LengthFieldBasedFrameDecoder | 将应用层数据包的长度,作为接收端应用层数据包的切分依据,按照应用层数据包的大小切分。这个切分器有一个要求,那就是应用层协议中包含数据包的长度。 |
比较常用的就是基于长度的切包器。
而基于长度的切包又分为6中情形,这6中情形在参考资料2中有详细的论述,可以参考。
参考资料:
1、https://www.jianshu.com/p/6a55b9fe4f10
2、https://www.jianshu.com/p/a0a51fd79f62