netty读源码:
搞清楚几个重要的概念
channel
channelPipeline
channelContext
从图中可以看出这几个概念之间的关系
pipeline中包含两个特殊的context,head和tail
以demo中的echo为例:
echoserverhandler实现的是inboundhandler,而headcontext实现了inboundhandler和outboundhanlder,所以读写事件都会处理,前提是做了fireread或者firewrite操作
从代码上看,当我们读消息的时候,到echoServerhanlder就结束了,现在用context写数据就是从echohandler开始
从代码上看是去找当前节点的的前一个outbound的context,就是headcontext,然后headcontext最终写到了outboundbuffer里,echoserverhanlder读完以后,最终做网络写数据的,是ctx.flush(),这个原理和write一样,也是找pre节点
当selector拿到读的请求时,会调用channelpipeline的firechannelread方法,然后从head开始逐个去调用
从headcontext中可以看到,没有做任何处理只是做了fireChannelRead,然后交给下级节点处理
当msg对完后,会调用channelpipeline的fireChannelReadComplete方法,然后流程和read类似
网友评论