当前位置:首页 > Web开发 > 正文

Netty快速入门(08)ByteBuf组件介绍

2024-03-31 Web开发

前面的内容对netty进行了介绍,写了一个入门例子。作为一个netty的使用者,我们存眷更多的还是业务代码。也就是netty中这两种组件:

ChannelHandler和ChannelPipeline---对应于NIO中的客户逻辑实现handleRead/handleWrite(interceptor pattern)

ByteBuf---- 对应于NIO 中的ByteBuffer

我们的业务逻辑要放在handler里面,读写数据用的是ByteBuf。其余的Transport、ServerBootstrap、Channel和EventLoop等等都是套路代码,对付应用措施来说,了解即可,根基上不用管。真正开发过netty项目也知道,项目中大部分都是handler类,其它组件只是占很少一部分。

Transport组件

netty做的对照有适应性的就是,不只撑持NIO,还撑持很多传输协议:

OIO -梗阻IO(真正开发梗阻IO项目,其实也没须要用netty了。。。)

NIO -Java NIO

Epoll - Linux Epoll(JNI)

Local Transport - IntraVM挪用(通讯的双方在同一个虚拟机之内不再走socket)

Embedded Transport - 供测试使用的嵌入传输

UDS- Unix套接字的本地传输(客户端和处事端都在同一个处事器上就可以使用,效率高)

使用差别个传输协议,只需要在通道里面设置差此外类型即可:

技术图片

netty中的channel类型如下:

技术图片

所以netty设置和转变传输协议都是一件很简单的工作。

EventLoopGroup和EventLoop组件

每个EventLoopGroup由多个EventLoop构成,并且多个EventLoop之间没有交互,各做各的事。

每个EventLoop对应一个线程(顶层担任Executor线程池,但是只有一个线程)

所有连接(channel)都将注册到一个EventLoop,并且只注册到一个,整个生命周期中都不会变革

每个EventLoop打点着多个连接(channel)

连接(Channel)上的读写事件是由EventLoop来措置惩罚惩罚的

处事端创建ServerBootstrap组件的时候,需要配置两个EventLoopGroup,parentGroup(也就是boss)卖力措置惩罚惩罚Accept事件,接收请求,childGroup(也就是worker)卖力措置惩罚惩罚读写事件。客户真个Bootstrap组件只需要一个EventLoopGroup即可。

ByteBuf组件

前面讨论NIO的时候,专门介绍过NIO的Buffer,相对付NIO,netty的ByteBuf越发易于使用:

为读/写分袂维护单独的指针,不需要通过flip()进行读/写模式切换

容量自动伸缩(类似于ArrayList,StringBuilder)

Fluent API (链式挪用)(ServerBootstrap 组件的配置方法就是链式挪用)

除了使用上之外,netty的ByteBuf还拥有更好的性能:

通过内置的CompositeBuffer来减少数据拷贝(Zero copy)

撑持内存池,减少GC压力

ByteBuf组件的操纵

ByteBuf通过两个索引(reader index、writer index)划分为三个区域:

reader index前面的数据是已经读过的数据,这些数据可以抛弃

从reader index开始,到writer index之前的数据是可读数据

从writer index开始,为可写区域

技术图片

来看下ByteBuf的主要操纵,第一种就是挨次的读写(转变reader/writer index):

writeByte() - 写一个字节

writeLong() - 写八个字节

writeXXX() - 所有write要领会让write index 往前走

readByte() - 读一个字节

readLong() - 读八个字节

readXXX() - 所有read要领会让read index往前走

第二种就是随机读写(不转变read/write index):

getXXX(index)

setXXX(index, byte)

前面NIO中的Buffer操纵用,有mark和reset要领,用来符号操纵的状态,,恢复状态,netty中也有类似的要领:

markReaderIndex()

markWriterIndex()

resetReaderIndex()

resetWriterIndex()

writerIndex(index) - 把write index 安排到参数中的index上面

readerIndex(index) - 把reader index安排到参数中的index上面

reader index前面的部分是已经读过的是不是浪费失了?netty供给了discardReadBytes要领,把reader index前面的内容抛弃失,就是把reader index后面的数据往前拷贝,这样空间就可以再操作了。这个要领和前面NIO中的compact要领类似。还有一个要领就是clear要领,把所有数据都清零,读索引和写索引归零:

技术图片

netty的ByteBuf中还供给了盘问要领:

indexOf

bytesBefore

forEachByte(ByteBufProcessor)

盘问要领有很多应用,好比在信息中有某个字符的存在,就需要做一些操纵,好比每碰到一个换行,就发送一条信息,这种成果在聊天顶用的很多。

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31648.html