Netty源码剖析
2021-05-15 15:00:57 44 举报
Netty源码解析
作者其他创作
大纲/内容
ChannelInboundHandlerAdapter
A1
channelPipeline
handler
channel
tail
注册
粘包
head
buffer
channelHandlerContext
SelectionKey
AbstractByteBuf.writeByte()
A2
Server
Client
ChannelPipeline提供了ChannelHandler链的容器。以客户端应用程序为例,如果事件的运动方向是从客户端到服务端的,那么我们称这些事件为出站的,即客户端发送给服务端的数据会通过pipeline中的一系列ChannelOutboundHandler(ChannelOutboundHandler 调用是从tail到head方向逐个调用每个handler的逻辑),并被这些Handler处理,反之则称为入站的,入站只调用pipeline里的ChannelInboundHandler逻辑(ChannelInboundHandler调用是从head到tail方向逐个调用每个handler的逻辑)。
Channel
心跳机制
ByteBuf.writeByte()
ChannelOutboundHandler
将Channel和事件绑定SelectionKey
NIO
Thread
ChannelHandler
Selector
maxCapacity:能接受的最大容量
A2_2
ChannelHandlerAdapter
channelHandler
拆包
minNewCapacity:要写入的大小
在客户端的handler中,重写channelInactive(),做重连操作 // channel 处于不活动状态时调用 @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { System.err.println(\"运行中断开重连。。。\"); nettyClient.connect(); }
this.ensureWritable0(1);
入站
断开重连
ByteBuf扩容机制
ChannelOutboundHandlerAdapter
BIO:同步阻塞模型NIO:同步非阻塞模型AIO(BIO2):异步非阻塞模型NIO重要的几个方法:1. Selector.open():在linux下,会创建epoll模型,这个方面调用的是native方法--epollCreate(),然后会调用linux的epoll_create()方法创建epoll模型。span style=\"font-size: inherit;\
ChannelInboundHandler
粘包拆包解决方法:(1)消息定长度:规定每天数据的长度,不足空位补齐。(2)在数据包尾部添加特殊分隔符(3)发送数据长度:发送数据的时候带上数据的长度
出站
handler的生命周期回调接口调用顺序:handlerAdded -> channelRegistered -> channelActive -> channelRead -> channelReadComplete-> channelInactive -> channelUnRegistered -> handlerRemovedandlerAdded: 新建立的连接会按照初始化策略,把handler添加到该channel的pipeline里面,也就是channel.pipeline.addLast(new LifeCycleInBoundHandler)执行完成后的回调;hannelRegistered: 当该连接分配到具体的worker线程后,该回调会被调用。hannelActive:channel的准备工作已经完成,所有的pipeline添加完成,并分配到具体的线上上,说明该channel准备就绪,可以使用了。hannelRead:客户端向服务端发来数据,每次都会回调此方法,表示有数据可读;hannelReadComplete:服务端每次读完一次完整的数据之后,回调该方法,表示数据读取完毕;hannelInactive:当连接断开时,该回调会被调用,说明这时候底层的TCP连接已经被断开了。hannelUnRegistered: 对应channelRegistered,当连接关闭后,释放绑定的workder线程;andlerRemoved: 对应handlerAdded,将handler从该channel的pipeline移除后的回调方法。
A2_1
BIO
Java I/O模型
0 条评论
下一页