Netty 入门笔记

来源:互联网 发布:数控g92带图编程实例 编辑:程序博客网 时间:2024/06/16 11:31

Netty

Bootstrap “引导”程序的类, 包括ServerBootstrap 和Bootstrap

ChannelHandler
ChannelHandler在ChannelPipeline中,用来处理入站和出站的消息

ChannelInboundHandler 处理入站消息
ChannelOutboundHandler 处理出站消息

ChannelInitializer 用来配置Handlers,通过ChannelPipline来添加ChannelHandlers, 其实 ChannelInitializer自身也是ChannelHandler

缓冲主要包括
ByteBuf
ByteBufHolder
Netty 使用 reference-counting(引用计数)来判断何时可以释放 ByteBuf 或 ByteBufHolder 和其他相关资源,从而可以利用池和其他技巧来提高性能和降低内存的消耗。

ByteBuf 提供两个指针变量支付读和写操作,读操作是使用 readerIndex(),写操作时使用 writerIndex()。这和JDK的ByteBuffer不同,ByteBuffer只有一个方法来设置索引,所以需要使用 flip() 方法来切换读和写模式。

ByteBuf 一定符合:0 <= readerIndex <= writerIndex <= capacity

Channel, ChannelPipline, ChannelHandler 的关系如下图。
这里写图片描述

ChannelPipeline 是一系列的ChannelHandler 实例,
每一次创建了新的Channel ,都会新建一个新的 ChannelPipeline并绑定到Channel上
ChannelHandler 可以属于多个 ChannelPipeline,通过@Sharable注解使其可以被共享到其他ChannelPipline

ChannelHandlerContext
接口 ChannelHandlerContext 代表 ChannelHandler 和ChannelPipeline 之间的关联,并在 ChannelHandler 添加到 ChannelPipeline 时创建一个实例。一个 ChannelHandlerContext 使 ChannelHandler 与 ChannelPipeline 和 其他处理程序交互

AttributeMap这是是绑定在Channel或者ChannelHandlerContext上的一个附件,相当于依附在这两个对象上的寄生虫一样,相当于附件一样,如图所示:
这里写图片描述

这个图还算比较形象地描述了AttributeMap的作用,我们知道每一个ChannelHandlerContext都是ChannelHandler和ChannelPipeline之间连接的桥梁,每一个ChannelHandlerContext都有属于自己的上下文,也就说每一个ChannelHandlerContext上如果有AttributeMap都是绑定上下文的,也就说如果A的ChannelHandlerContext中的AttributeMap,B的ChannelHandlerContext是无法读取到的
注意:Netty 4.1 后取消了ChannelHandlerContext 的AttributeMap, 只保留Channel 的AttributeMap, 以免用户会 。具体使用时,不要再用ChannelHandlerContext.attr() , 而是采用 Channel.attr() .

EventLoop 接口代表事件循环, EventLoopGroup 代表事件集合
这里写图片描述

ChanelPipline 中 ChannelHandler 处理流程
注意:ChannelHandler 可以属于多个 ChannelPipeline

这里写图片描述

原创粉丝点击