对Netty组件的基本介绍
Netty的介绍
netty是一个异步的基于事件的框架,主要针对在tcp协议下,开发面向clients端的高并发应用。
netty本质是一个nio框架。
IO模型
Java共支持3中io模型 : BIO,AIO,NIO
BIO
同步阻塞,一个连接一个线程,有连接请求时服务端就需要启动一个线程处理。如果这个线程不做任何事就会造成不必要的开销。当并发数较大时,需要创建大量线程来处理连接。
NIO
同步非阻塞,可以做到一个线程处理多个操作。
NIO 有三大核心部分,Channel,Buffer ,selector
selector、 channel 和buffer的关系
- 每个channel 对应一个buffer
- selector 对应一个线程,一个线程对应多个channel
- 程序切换哪个channel 是由事件决定的。event
- selector 会根据不同的事件,在各个通道上切换
- Buffer 就是一个内存块,底层是有一个数组
- 数据的读取写入是通过buffer,既可以读也可以写, 两者切换的方法是flip
- channel 是双向的
- capacity
- position
- limit
重要的方法
allocate(int count) 初始化buffer容量
get () 从 position 位置读
flip() 由写模式切换为读模式
Channel 通道 【对Netty组件的基本介绍】作用类似于流,但是可以同时进行读写,可以异步读写。
Channel在NIo中是一个接口,它的实现类有:
- FileChannel 用于文件读写
- ServerSocketChannel TCP数据读写
- DatagramChannel 用于UDP数据读写
- read 从通道读取数据并放到缓冲区中
- write 把缓冲区的数据写到通道中
- transferfrom
- transferto
主要方法:
- open 获取一个选择器对象
- SelectionKey register(seelctor,常量) 注册通道 ,常量一共有4种,read读,write写,connect 连接已建立 ,accept(有新的网络连接可以接入)
- select() 监测所有注册的通道,阻塞
类库与API复杂,开发难度大,有bug
Netty模型
- netty抽象出2组线程池,bossGroup 负责接受客户端的连接,workGroup 负责读写
- bossGroup 与workerGroup 都是NioEventLoopGroup
- 每一个NioEventLoopGroup相当于一个事件循环组,每个循环都是NIoEventLoop
- NIoEventLoop表示一个不断循环处理执行任务的线程
Channel
ChannelFuture
netty中所有操作都是异步的,所以我们需要一个能够确定其结果的方法。通过addListener() 方法获取通知。
ChannelHandler
处理入站和出栈逻辑的容器。
生命周期方法
handlerAdded 当ChannelHandler 添加到ChanelPipeLine中调用
handlerRemoved 移除时调用
它主要有2个子接口, ChannelInboundHandler 和 ChannelOutBoundHandler
ChannelPipeLine
它是ChannelHandler 的容器,内部定义了一组ChannelHandler,是一组过滤器链
ChannelHandlerContext
用于ChannelPipe 和 ChannelHandler的关联,同一个ChannelPipeline 里的ChannelHandler的交互。
ByteBuf
netty的数据容器,是netty实现数据传输的数据结构。
内部维护了两个不同的索引,readIndex ,writeIndex。通过这两个索引将数据划分为3个区域。已经读过的字节,可读字节,可写字节。相比于jdk原生的bytebuf ,它有两个指针,在读写转换时不需要进行flip()
到此这篇关于对Netty组件的基本介绍的文章就介绍到这了,更多相关Netty组件介绍内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 布丽吉特,人生绝对的赢家
- 进必趋|进必趋 退必迟,问起对 视勿移
- 对称加密和非对称加密的区别
- 对抗抑郁最好的方法
- 装聋作哑,关系融洽
- 社保代缴公司服务费包含哪些
- 数组常用方法一
- 幸福的婚姻不争对错!读《你要的是幸福还是对错》有感。
- 把一切献给现在
- 年轻人对未来迷茫时该怎么办()