INDEX

  • Bootstrap & ServerBootstrap
  • Channel
  • Future & ChannelFuture
  • Selector
  • ChannelHandler
  • Pipeline & ChannelPipeline
  • ChannelHandlerContext
  • ChannelOption
  • ChannelGroup
  • NioEventLoop
  • NioEventLoopGroup
  • Unpooled
  • ByteBuf

Bootstrap & ServerBootstrap

作用

  • 用于引导 Netty 应用
  • 可以对 Netty 进行配置
  • Bootstrap 用于引导客户端,ServerBootstrap 用于引导服务端

常用方法
配置 EventLoop
group()

  • 服务端需要配置两个,通常叫做 boss、workers
  • 客户端只需要配置一个

配置服务端通道实现类
channel()

ServerChannel 添加配置
option()

为接受到的通道添加配置
childOption()

为 boss 配置业务处理类
handler()

为 worker 配置业务处理类
childHandler()

服务端绑定端口
bind()

客户端连接服务器
connect()

Channel

作用

  • Netty 网络通讯的组件,用于网络 IO 操作
  • 支持关联的 IO 的操作,以及与之对应的处理逻辑
  • 可以获取相关信息,如状态、配置等
  • 异步调用的,会立即返回 ChannelFuture
  • 实现丰富,以应对不同协议、不同阻塞类型
    • NioSocketChannel:异步,客户端,TCP
    • NioServerSocketChannel:异步,服务端,TCP
    • NioDatagramChannel:异步,UDP
    • NioSctpChannel:异步,客户端,SCTP
    • NioSctpServerChannel:异步,服务端,SCTP

常用方法
获取 Pipeline
Pipeline()

获取配置
config()

获取访问地址
remoteAddress()

写出并刷新
writeAndFlush()

Future & ChannelFuture

作用

  • 用于异步监听操作的执行结果
  • 可以配合 FutureListener 机制使用

常用方法
返回通道
channel()

等待异步操作执行完成
sync()
注意这个方法是同步的
它是同步的等待,但被等待的是个异步操作

添加监听器
addListener()

Selector

作用

  • Netty 网络通讯的组件,用于实现多路复用,做到一个线程监管多个 Channel
  • 集成在 EnentLoop 中,其上级对象叫 chooser
  • 可以对 EnentLoop 中的通道进行轮询,并在其就绪时选中

更多信息参考 基础 | NIO - [Selector]

ChannelHandler

作用

  • Netty 网络通讯的组件

    • 可以处理 IO 事件
    • 也可以拦截 IO 事件,并将 IO 事件转发给 Pipeline 的下一个 handler
  • 多个 ChannelHandler 可以协同处理业务
  • 很类似过滤器
  • 本身是个接口,提供丰富的待实现方法
    • 接口分出两个分支

      • ChannelInboundHandler:负载处理进站 IO 事件
        用于处理 从对方流向自己 的 IO 事件,比如作为客户端接受服务端响应
      • ChannelInboundHandler:负载处理出站 IO 事件
        用于处理 从自己流向对方 的 IO 事件,比如作为客户端向服务端发请求
      • 其实还有个 ChannelDuplexHandler,但使用场景很少 (违反单一职责违反的太明显了)
    • 接口和两个分支接口,各自有一个配置模式实现
    • 对应类图如下

常用方法
激活时回调
channelActive()

取消激活时回调
channelInactive()

读取时回调
channelRead()

读取完成时回调
channelReadComplete()

写出时回调
channelWrite()

写出完成时回调
channelWriteComplete()

异常时回调
exceptionCaught()

handler 加入时回调
handlerAdded()
hander 已经加入了对应的 context 并可以真正处理事件时触发

  • 相当于一个 Channel 注册到 Selector 并完成准备工作时触发
  • 相当于一个新连接建立完全后触发

handler 移除时回调
handlerRemoved()

Pipeline & ChannelPipeline

作用

  • 作为 Handler 的集合,负责处理、拦截出入站 IO 事件
  • 很类似过滤器栈,责任链模式
  • 可以完全控制 IO 事件的处理方式,并控制各个 ChannelHandler 如何相互调用

结构

  • 每个 Channel 都有且仅有一个 Pipeline
    二者关系参考 并发编程 | Netty - [Reactor 模型]
  • ChannelPipeline 本质上是一个双向链表
  • 链表的节点类型是 ChannelHandlerContextChannelHandlerContext 内部是 ChannelHandler
  • 通常不同 Pipeline 中的 ChannelHandler 不共享
    技术上是可以做到共享的,但是一旦共享就需要处理线程安全问题,影响性能
  • 入站、出站的 ChannelHandler 在同一个链表中,但不会互相影响,Handler 与当前操作不符时会直接放行

常用方法
头部追加 Handler
addFirst()

尾部追加 Handler
addLast()

ChannelHandlerContext

作用

  • Pipeline 中直接节点的类型,里面封装了 ChannelHandler

    • ChannelHandler 中方法普遍带有 ChannelHandlerContext 类型的参数
    • 可以从中获取关键对象,如 pipeline()channel()
    • 可以直接调用 ChannelHandler 的方法,如 writeAndFlush()

ChannelOption

作用

  • 用于配置 Netty 中的 Channel

常用配置
SO_BACKLOG
配置 TCP/IP 协议中,初始化服务器可连接队列的大小

SO_KEEPALIVE
配置是否保持连接存活

ChannelGroup

作用

  • Channel 的容器,用于存储、管理所有注册在其中的 Channel

常用方法
注册 channel
addd()

广播写
writeAndFlush()

NioEventLoop

作用

  • 每个 NioEventLoop 包含一个 Selector
    相当于经典 Reactor 模型中一个 Reactor + Handler
  • 保持有一个任务队列,每一轮轮询并处理事件后,可以执行其中的任务
  • 以事件循环的方式处理绑定在其中的 Socket
    • select:通过集成的 Selector 监听绑定的 Socket 的关注事件
    • processSelectedKeys:处理选中的 key,即处理就绪的事件
    • runAllTasks:执行任务队列中的所有任务

NioEventLoopGroup

作用

  • 可以包含多个 NioEventLoop

    • 每个 NioEventLoop 对应一个 Selector 和一个线程
    • 通常一个 ServerSocketChannel 对应一个 NioEventLoop
  • 可以分为两组协同作业(常见于服务端)
    • BossGroup:负责 accept,通常只有一个 NioEventLoop
    • WorkerGroup:负责读写,通常有多个 NioEventLoop
  • 通过 chooser.next() 接口获取某个 NioEventLoop 进行处理当前的 SocketChannel

常用方法
优雅停机(断开连接,关闭线程)
shutdownGracefull()

Unpooled

作用

  • Netty 提供的缓冲区操作工具类

常用方法
初始化 ByteBuf
copiedBuffer(CharSequence, Charset)

开辟 ByteBuf
buffer(size)

ByteBuf

作用

  • Netty 提供的字节缓冲区
  • 效率比 NIO 的 ByteBuffer 高
  • 不需要反转 flip()

重要属性
capacity
容量,是 ByteBuf 内部用于存放数据的容器的大小,而不是实际数据量
统一由 capacity() 返回,真实获取方式随具体实现变化,如 array.lengthcapacity

readIndex
下一个读入的位置

writeIndex
下一个读入的位置

属性关系图

常用方法
长度
capacity()

数据写入
writeByte
向缓冲区写入字节
writerIndex 会 +1

读取数据
readByte()
从缓冲区读取字节
readerIndex 会 +1

获取读指针
readerIndex()
读指针指向即将被读的位置

获取写指针
writerIndex()
写指针指向即将被写的位置

读取数据
getByte(index)
获取指定 index 的字节
不影响 readIndex

按 index 范围读取字符串
getCharSequence(start,end,charset)

是否有数组
hasArray()
如果返回 true 才能安全的 array()arrayOffset()

获取 byte 数组
array()

获取字节数组中第一个字节的偏移量
arrayOffset()

获取可读字节数
readableBytes()
参考 属性关系图

并发编程 | Netty - [常用组件概要]相关推荐

  1. java并发类_Java并发编程之常用的辅助类详解

    1.CountDownLatch 1.2.示例:班长锁门问题 问题描述:假如有7个同学晚上上自习,钥匙在班长手上,并且要负责锁门.班长必须要等所有人都走光了,班长才能关灯锁门.这6个同学的顺序是无序的 ...

  2. Java架构技术文档:并发编程+设计模式+常用框架+JVM+精选视频

    本篇文章是我们整理的一份架构师的成长路线,包括了并发编程.设计模式.常用框架.中间件.微服务与分布式.常用工具.JVM.MySQL.数据结构与算法,还有架构师精选视频.架构师成长路线高清大图. 又是新 ...

  3. 教你“强人锁男”——java并发编程的常用锁类型

    Java 并发编程不可不知的七种锁类型与注意事项 锁是java并发编程中最重要的同步机制.锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息.锁是解决并发冲突的重要工具.在开发 ...

  4. java并发编程中常用的工具类 Executor

    /***************************************************  * TODO: description .  * @author: gao_chun  * ...

  5. 并发编程-17AQS同步组件之 Semaphore 控制并发线程数的信号量

    文章目录 J.U.C脑图 Semaphore 概述 Semaphore 构造函数及方法 构造函数 常用和需要注意的方法 Semaphore 示例 acquire() semaphore.acquire ...

  6. 并发编程-19AQS同步组件之重入锁ReentrantLock、 读写锁ReentrantReadWriteLock、Condition

    文章目录 J.U.C脑图 ReentrantLock概述 ReentrantLock 常用方法 synchronized 和 ReentrantLock的比较 ReentrantLock示例 读写锁R ...

  7. 并发编程-16AQS同步组件之CountDownLatch 闭锁

    文章目录 脑图 CountDownLatch闭锁 示例 Thread#join() CountDownLatch CountDownLatch示例二 await一直等待其他线程执行完 CountDow ...

  8. 《Java 7 并发编程指南》学习概要 (3)Semaphore, CountDownLatch, CyclicBarrier , Phaser, Exchanger...

    1.Semaphore  信号量 Semaphore(信号量)是一个控制访问多个共享资源的计数器. 当一个线程想要访问某个共享资源,首先,它必须获得semaphore.如果semaphore的内部计数 ...

  9. 并发编程-18AQS同步组件之 CyclicBarrier 同步屏障

    文章目录 J.U.C脑图 CyclicBarrier CyclicBarrier的应用场景 示例 await await(long timeout, TimeUnit unit) CyclicBarr ...

最新文章

  1. 爬虫的系统框架组成-控制器
  2. SAP QM 检验批上各个MIC质检结果的查询报表?
  3. 无根树转有根树的一般方法
  4. spring事务管理-xml配置aop事务(重点)
  5. 21行代码AC_ 试题H: 修改数组【解题报告】
  6. git常用命令及配置
  7. Halcon :畸变矫正与标定(2)
  8. python怎么改变字体大小_python IDLE 背景以及字体大小的修改方法
  9. tensorflow测量工具的使用
  10. bash/shell 解析命令行参数工具:getopts/getopt
  11. WebbUpload的验证问题
  12. 关于InnerHTML存在的问题
  13. qt deleterLater
  14. Day.js 是一个仅 2kb 大小的轻量级 JavaScript 时间日期处理库,和 Moment.js 的 API 设计保持完全一样,dayjs...
  15. 怎么降低照片大小kb?
  16. 计算机黑屏 风扇转,打开电脑黑屏,但风扇还在转,为什么?
  17. 教你免费使用百度云GPU算力提交深度学习任务
  18. 函数(python学习)
  19. 软件定义网络(PART 3)
  20. 浅谈缓冲的理论与实践

热门文章

  1. modbus通讯失败_【分享】Modbus通讯失败后数据一直保持不变,差点引起事故,检查Modbus通讯失败次数...
  2. java省市县联动 下拉框选择_原生JavaScript实现动态省市县三级联动下拉框菜单实例代码...
  3. python统计字符出现次数
  4. APP市场推广统计有效推广量新思路
  5. 投资笔记 - 小表弟
  6. 微信小程序swiper闪烁抖动卡死问题
  7. ArangoDB安装
  8. 阿里云RDS Mysql 8.0 与本地主从同步
  9. android 字体慢慢变大 网易新闻,网易新闻怎么设置字体大小?网易新闻设置字体大小的方法...
  10. 在lammps模拟过程中的常用势函数设置