Netty快速入门(08)ByteBuf组件介绍
前面的内容对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