博客
关于我
Netty源码—8.编解码原理一
阅读量:789 次
发布时间:2023-02-15

本文共 1700 字,大约阅读时间需要 5 分钟。

Netty数据读取与解码入门

1. 读数据入口

当客户端Channel的Reactor线程NioEventLoop检测到有读事件时,会执行NioByteUnsafe的read()方法。该方法会调用doReadBytes()方法将TCP缓冲区的数据读到由ByteBufAllocator分配的一个ByteBuf对象中,然后通过pipeline.fireChannelRead()方法带上这个ByteBuf对象向下传播ChannelRead事件。

在传播过程中,首先会来到pipeline的head结点的channelRead()方法。该方法会继续带着那个ByteBuf对象向下传播ChannelRead事件,比如会来到ByteToMessageDecoder结点的channelRead()方法。

需要注意的是,服务端Channel的unsafe变量是一个NioMessageUnsafe对象,而客户端Channel的unsafe变量是一个NioByteUnsafe对象。

2. 拆包原理

不用Netty的拆包原理

不断地从TCP缓冲区中读取数据,每次读完都判断是否为一个完整的数据包。如果当前读取的数据不足以拼接成一个完整的数据包,就保留数据,继续从TCP缓冲区中读。如果当前读取的数据加上已读取的数据足够拼成完整的数据包,就将拼好的数据包往业务传递,而多余的数据则保留。

Netty的拆包原理

Netty拆包基类内部会有一个字节容器,每次读取到数据就添加到字节容器中。然后尝试对累加的字节数据进行拆包,拆成一个完整的业务数据包,这个拆包基类叫ByteToMessageDecoder。

3. ByteToMessageDecoder解码步骤

(1) 解码的整体步骤

(2) 首先累加字节流

如果当前字节容器中没有数据,那么就将字节容器的指针指向新读取的数据。如果当前字节容器中有数据,那么就调用累加器的cumulate()方法将数据累加到字节容器。

(3) 然后调用子类的decode()方法进行解析

把累加字节容器里的字节流通过子类的decode()方法进行解析。

(4) 接着清理字节容器

为了防止发送端发送数据过快,ByteToMessageDecoder会在读取完一次数据并完成业务拆包后,清理字节容器。

(5) 最后将解析到的ByteBuf向下传播

如果调用子类的decode()方法可以解析到一个ByteBuf对象,则将这个ByteBuf对象向下传播。

4. 解码器抽象的解码过程总结

解码过程是通过一个叫ByteToMessageDecoder的抽象解码器来实现的,ByteToMessageDecoder实现的解码过程分为如下四步:

(1) 累加字节流

也就是把当前读到的字节流累加到一个字节容器里。

(2) 调用子类的decode()方法进行解析

ByteToMessageDecoder的decode()方法是一个抽象方法,不同种类的解码器会有自己的decode()方法逻辑。

(3) 清理字节容器

为了防止发送端发送数据过快,ByteToMessageDecoder会在读取完一次数据并完成业务拆包后,清理字节容器。

(4) 传播已解码的业务数据包

如果List列表里有解析出来的业务数据包,那么就通过pipeline的事件传播机制往下进行传播。

5. Netty里常见的开箱即用的解码器

(1) 基于固定长度解码器

判断当前字节容器可读字节是否小于固定长度。

(2) 基于行分隔符解码器

基于行分隔符的拆包器可以同时处理\n和\r\n两种类型的行分隔符,其处理逻辑分为非丢弃模式和丢弃模式、找到行分隔符和未找到行分隔符的情况。

(3) 基于分隔符解码器

可以向基于分隔符解码器DelimiterBasedFrameDecoder传递一个分隔符列表,这样该解码器就会按照分隔符列表对数据包进行拆分。

(4) 基于长度域解码器

主要的逻辑步骤如下:

(1) 丢弃模式的处理

(2) 获取待拆数据包的大小

(3) 对数据包进行长度校验

(4) 跳过指定字节长度

(5) 抽取数据包

转载地址:http://xvcfk.baihongyu.com/

你可能感兴趣的文章
Mysql:避免重复的插入数据方法汇总
查看>>
M_Map工具箱简介及地理图形绘制
查看>>
m_Orchestrate learning system---二十二、html代码如何变的容易
查看>>
n = 3 , while n , continue
查看>>
n 叉树后序遍历转换为链表问题的深入探讨
查看>>
N-Gram的基本原理
查看>>
n1 c语言程序,全国青少年软件编程等级考试C语言经典程序题10道七
查看>>
nacos config
查看>>
Nacos Derby 远程命令执行漏洞(QVD-2024-26473)
查看>>
Nacos 与 Eureka、Zookeeper 和 Consul 等其他注册中心的区别
查看>>
Nacos2.X 配置中心源码分析:客户端如何拉取配置、服务端配置发布客户端监听机制
查看>>
NacosClient客户端搭建,微服务注册进nacos
查看>>
Nacos做注册中心使用
查看>>
Nacos原理
查看>>
Nacos发布0.5.0版本,轻松玩转动态 DNS 服务
查看>>
Nacos启动异常
查看>>
Nacos和Zookeeper对比
查看>>
Nacos在双击startup.cmd启动时提示:Unable to start embedded Tomcat
查看>>
Nacos如何实现Raft算法与Raft协议原理详解
查看>>
Nacos安装教程(非常详细)从零基础入门到精通,看完这一篇就够了
查看>>