ByteBuf

JDK原生ByteBuffer的核心功能

  1. 字节缓冲区,主要对字节进行操作的一个类

  2. 能够将缓冲区建立在堆内和堆外。普通的new byte[] ,都只是建立在堆内

Netty之所以要自己封一套ByteBuf的主要原因是:

  1. 原生ByteBuffer 容量固定,一旦分配不能动态扩容和收缩。

  2. 原生ByteBuffer 的API使用不够优雅。稍有不慎,使用将会出错。它有3个核心指针,分别为position、 limit、capacity 。position : 位置,表示缓冲区中正在操作数据的位置。limit : 界限,表示缓冲区中可以操作数据的大小,(limit 后数据不能进行读写) capacity : 容量。读写需要调用flip()、rewind()、clear()等方法来移动相关指针 。

ByteBuf 呢?它使用了核心的两个位置指针来协助读写操作,分别为readerIndex和writerIndex,数据读取readerIndex会增加,数据写入writerIndex会增加,不需要增加额外的操作来移动相关指针。此外 readerIndex 是不可能超过 writerIndex。读取过 的 0 ~ readerIndex 这部分空间是被视为弃用的,同时它可以进行自动扩容。

Channel

Channel 是网络操作抽象类,聚合了一组功能,提供了比原生Java SocketChannel、ServerSocketChannel大而全的功能接口,供业务开发者使用,包括但不限于网络的读、写、发起连接、关闭连接、获取通信双方的地址。

UnSafe

Channel 的辅助操作类,操作底层网络I/O,都是由它负责实现。

ChannelPipeLine

是Channel数据管道的一个抽象,消息在ChannelPipeLine中流动和传递。它根据I/O事件的类型,将消息传递给ChannelHandler进行处理。同时对ChannelHandler链表进行管理和调度。在读取数据时,ChannelHandler链表的调度顺序是ch1,ch2,ch3,写数据时调度顺序为ch3,ch2,ch1。可以说它是ChannelHandler的一个管理容器。

ChannelHandler

处理相应I/O事件的通道消息处理器,比如,读事件、写事件、读完成事件、写完成事件等,Netty中众多的编解码器等都是实现自 ChannelHandler。

ChannelHandlerContext

通道处理器上下文,通过它来完成Channel 、ChannelPipeline、ChannelHandler这几个组件之间的交互,采用知识最小化原则让每个组件只关心ChannelHandlerContext相关API,。

ok,我们来大致梳理一下关于通道的几个核心类关系。

  1. 每个Channel会绑定一个ChannelPipeline,ChannelPipeline中也会持有Channel的引用

  2. ChannelPipeline持有ChannelHandlerContext链路,保留ChannelHandlerContext的头尾节点指针

  3. 每个ChannelHandlerContext会对应一个ChannelHandler,也就相当于ChannelPipeline持有ChannelHandler链路

  4. ChannelHandlerContext同时也会持有ChannelPipeline引用,也就相当于持有Channel引用

NioEventLoopGroup

Netty遵循Reactor基础线程模型的一个具体实现。以下是Reactor几种基础线程模型介绍。

Reactor 单线程模型,所有的I/O操作都在同一个线程上完成。

Reactor多线程模型,有一个用于专门接收客户端TCP连接的NIO线程,网络I/O 读、写操作有专门一个NIO线程池处理。

主从Reactor多线程模型,专门接收客户端TCP连接的不在是一个线程,而是一个独立的线程池(主),网络I/O 读、写操作仍然是专门一个NIO线程池处理(从)

跟多精彩以及需要这方面资料的欢迎光顾公众号 编程简单学丶 回复java

java开怎么能不知道Netty几个核心类呢?相关推荐

  1. Java开发面试题——很有帮助的

    面试题 一.Java 1.运行机制 1)Java跨平台原理 Java实现跨平台是JVM(Java虚拟机)起的作用.如果是C/C++的编译方式,一旦换了一个平台,那么就需要重新编译一份对应的可执行代码, ...

  2. Java游戏服务器系列之Netty详解

    今天带大家来学习Java游戏服务器的相关知识,文中对Netty作了非常详细的介绍,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下 一.简介 Java的底层API逐渐复杂,而开发者面对的 ...

  3. Java开发面试题及答案,5年crud“经验

    由于篇幅限制,我就只以截图展示目录内容以及部分笔记内容,获取完整版王者级核心宝典只需要点击**点赞+关注,再点右边:https://docs.qq.com/doc/DWFdDS3JZZ1F4TmZU* ...

  4. 我的Java开发之路

    最近有一位小伙伴通过公众号给我留言, "我参加工作没多久,看着圈里的技术大牛,特别羡慕,也渴望成为技术大牛,想让您分享一下从小白到大牛是怎样练成的,我该如何提高自己" 首先,谢谢这 ...

  5. 面试java回答优缺点_阿里Java开发面经分享,面试题(附回答)

    下面要给大家分享一个阿里Java开发面经,里面包含了具体的问题,以及相关回答,主要包括了数据库.操作系统.项目相关.java基础.数据结构.计算机网络等内容. 一.数据库 1.为什么在项目中用Mong ...

  6. java中channelmessage,MessagePack在Netty中的应用

    [toc] MessagePack在Netty中的应用 前面使用Netty通信时,传输的都是字符串对象,因为在进行远程过程调用时,更多的是传输pojo对象,这时就需要对pojo对象进行序列化与反序列化 ...

  7. java学习_都说Java难学,不知道具体的学习内容?全套Java学习路线送上

    首先,我个人比较推崇的学习方法是:先学java前段,也就是HTML,css,js,因为学习java以后肯定是往java ee方向发展的,学习完前端,在学习后端很多东西比计较容易理解! 其中J2SE是关 ...

  8. java 自动生成文档_[原]java开发文档的自动生成方式

    对于Java注释我们主要了解三种: // 注释一行 /* ...... */ 注释若干行 第三种,文档注释: /** ...... */ 注释若干行,并写入 javadoc 文档 通常这种注释的多行写 ...

  9. java transferto_小六六学Netty系列之Java 零拷贝

    前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger种一棵树最好的时间是十年前,其次是现在 我知道很多人不玩qq了 ...

最新文章

  1. Android 跨进程通信基础
  2. c# 自定义文件关联程序
  3. generator (2)
  4. 清单文件,测试,打电话和发短信应用
  5. html 换行符_每个非网站开发人员都应该了解的21个HTML基础知识
  6. TransCenter解读
  7. python多线程输出_萌新python多线程
  8. linux由众多微内核组成,什么是linux
  9. 数据结构与算法学习笔记02-单向链表
  10. 《Java编程规范学习笔记》
  11. 信息与通信的数学基础——Mathematic入门
  12. labView2015 学习之项目创建模板篇
  13. Autovue 21.0.2.5 在2020年7月份发布
  14. 电商 关注 取消关注 人数+-
  15. HTML5文件夹隐藏了怎么打开,win10怎么打开隐藏文件夹
  16. 互联网医院系统搭建,打造在线问诊系统新模式
  17. Qt QLineEdit单行输入框用法详解
  18. 爱普生Epson SureColor T5480 打印机驱动
  19. 阿里云漏洞验证需要付费的解决方法
  20. discuzdiy图片模块_dz论坛diy教程,discuz论坛DIY详细教程 论坛diy教程

热门文章

  1. 看完这些能控制大脑的寄生虫,你会怀疑人类!
  2. python编写自定义函数计算一维numpy数组中与指定目标数值最接近(距离最近)的数值(find closest value in numpy array to a certain value)
  3. R语言plotly包可视化线图(line plot)、使用restyle参数自定义设置可视化结果中线条的颜色、使用按钮动态切换线条的颜色(change line color with button)
  4. R语言使用fs包的dir_create函数在指定路径下创建新的文件夹、使用file_create函数在指定文件夹下创建文件
  5. 使用Pandas的rolling函数计算滚动平均值(rolling average with Pandas rolling)、seaborn使用lineplot函数可视化时间序列数据、并添加滚动平均值
  6. python基于tpot训练模型并抑制输出stackingestimator、而是输出单模型例如xgboost设置
  7. R语言Logistic回归模型案例基于AER包的affair数据分析
  8. jupyter配置默认启动目录
  9. oracle断电 ora01110,oracle在做备份的时候断电
  10. cmd删除oracle监听,oracle数据库监听删除