C1 C2 C3 客户端
| | |
| | |Channel(客户端到服务器端的通信管道)
---------------------------------------
BossGroup(EventLoop)客户端与服务器连接的线程池
Channel需要注册到一个EventLoop并成功建立连接(channel状态顺序:注册到EventLoop,成功建立连接,段开连接,丢失注册信息)
EventLoop EventLoop EventLoop
| | |
| | |
-----------------------------
WorkGroup(EventLoop)用于处理客户端传来的数据的线程池
EventLoop EventLoop EventLoop
| | |
| | |Channel
---------------------------
pipeline(容器:管理每个连接线程用于数据处理的Handler)
Added添加一个Handler到pipeline容器中,Removed移出一个Handler,出现异常exceptionCaught
ChannelPipeline
_____________________________
Channel| Handler Handler Handler
| | |
ctx ctx ctx(跳跃式执行)
ctx:ChannelHandlerContext 这是Handler与pipeline的桥梁
ChannelHandlerContext,channel,ChannelPipeline 中的部份方法是重合的 如write方法
write方法传向下一个Handler 整个管道里传播
ctx.writeAndFlush() Channel channel = ctx.channel();channel.writeAndFlush()
ChannelPipeline channelPipeline = ctx.pipiline(); channelPipeline.writeAndFlush()
Handler执行顺序
InboundHandler顺序执行,OutboundHandler逆序执行
ChannelHandlerContext跳跃式执行
ch.pipeline().addLast(new InboundHandler1()) 1
ch.pipeline().addLast(new OutboundHandler1()) 不执行
ch.pipeline().addLast(new OutboundHandler2()) 不执行
ch.pipeline().addLast(new InboundHandler2()) 2
ch.pipeline().addLast(new OutboundHandler1()) 2
ch.pipeline().addLast(new OutboundHandler2()) 1
ch.pipeline().addLast(new InboundHandler1()) 不执行
ch.pipeline().addLast(new InboundHandler2()) 不执行
执行顺序与Handler到pipeline容器存放顺序有关,只执行第一个同类型的Handler,并按in正序,out倒序的方法,中间被跳过
channel.writeAndFlush()
channelPipeline.writeAndFlush()
这两个会全部执行