并发编程 | Netty - [常用组件概要]
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
:异步,客户端,TCPNioServerSocketChannel
:异步,服务端,TCPNioDatagramChannel
:异步,UDPNioSctpChannel
:异步,客户端,SCTPNioSctpServerChannel
:异步,服务端,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
本质上是一个双向链表- 链表的节点类型是
ChannelHandlerContext
,ChannelHandlerContext
内部是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.length
,capacity
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 - [常用组件概要]相关推荐
- java并发类_Java并发编程之常用的辅助类详解
1.CountDownLatch 1.2.示例:班长锁门问题 问题描述:假如有7个同学晚上上自习,钥匙在班长手上,并且要负责锁门.班长必须要等所有人都走光了,班长才能关灯锁门.这6个同学的顺序是无序的 ...
- Java架构技术文档:并发编程+设计模式+常用框架+JVM+精选视频
本篇文章是我们整理的一份架构师的成长路线,包括了并发编程.设计模式.常用框架.中间件.微服务与分布式.常用工具.JVM.MySQL.数据结构与算法,还有架构师精选视频.架构师成长路线高清大图. 又是新 ...
- 教你“强人锁男”——java并发编程的常用锁类型
Java 并发编程不可不知的七种锁类型与注意事项 锁是java并发编程中最重要的同步机制.锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息.锁是解决并发冲突的重要工具.在开发 ...
- java并发编程中常用的工具类 Executor
/*************************************************** * TODO: description . * @author: gao_chun * ...
- 并发编程-17AQS同步组件之 Semaphore 控制并发线程数的信号量
文章目录 J.U.C脑图 Semaphore 概述 Semaphore 构造函数及方法 构造函数 常用和需要注意的方法 Semaphore 示例 acquire() semaphore.acquire ...
- 并发编程-19AQS同步组件之重入锁ReentrantLock、 读写锁ReentrantReadWriteLock、Condition
文章目录 J.U.C脑图 ReentrantLock概述 ReentrantLock 常用方法 synchronized 和 ReentrantLock的比较 ReentrantLock示例 读写锁R ...
- 并发编程-16AQS同步组件之CountDownLatch 闭锁
文章目录 脑图 CountDownLatch闭锁 示例 Thread#join() CountDownLatch CountDownLatch示例二 await一直等待其他线程执行完 CountDow ...
- 《Java 7 并发编程指南》学习概要 (3)Semaphore, CountDownLatch, CyclicBarrier , Phaser, Exchanger...
1.Semaphore 信号量 Semaphore(信号量)是一个控制访问多个共享资源的计数器. 当一个线程想要访问某个共享资源,首先,它必须获得semaphore.如果semaphore的内部计数 ...
- 并发编程-18AQS同步组件之 CyclicBarrier 同步屏障
文章目录 J.U.C脑图 CyclicBarrier CyclicBarrier的应用场景 示例 await await(long timeout, TimeUnit unit) CyclicBarr ...
最新文章
- 爬虫的系统框架组成-控制器
- SAP QM 检验批上各个MIC质检结果的查询报表?
- 无根树转有根树的一般方法
- spring事务管理-xml配置aop事务(重点)
- 21行代码AC_ 试题H: 修改数组【解题报告】
- git常用命令及配置
- Halcon :畸变矫正与标定(2)
- python怎么改变字体大小_python IDLE 背景以及字体大小的修改方法
- tensorflow测量工具的使用
- bash/shell 解析命令行参数工具:getopts/getopt
- WebbUpload的验证问题
- 关于InnerHTML存在的问题
- qt deleterLater
- Day.js 是一个仅 2kb 大小的轻量级 JavaScript 时间日期处理库,和 Moment.js 的 API 设计保持完全一样,dayjs...
- 怎么降低照片大小kb?
- 计算机黑屏 风扇转,打开电脑黑屏,但风扇还在转,为什么?
- 教你免费使用百度云GPU算力提交深度学习任务
- 函数(python学习)
- 软件定义网络(PART 3)
- 浅谈缓冲的理论与实践
热门文章
- modbus通讯失败_【分享】Modbus通讯失败后数据一直保持不变,差点引起事故,检查Modbus通讯失败次数...
- java省市县联动 下拉框选择_原生JavaScript实现动态省市县三级联动下拉框菜单实例代码...
- python统计字符出现次数
- APP市场推广统计有效推广量新思路
- 投资笔记 - 小表弟
- 微信小程序swiper闪烁抖动卡死问题
- ArangoDB安装
- 阿里云RDS Mysql 8.0 与本地主从同步
- android 字体慢慢变大 网易新闻,网易新闻怎么设置字体大小?网易新闻设置字体大小的方法...
- 在lammps模拟过程中的常用势函数设置