netty4 学习及源码纵览

这个是通讯过程的总结,作者写的很宏观,我很喜欢。

http://blog.csdn.net/jiangguilong2000/article/details/43317219

netty Server 段入口的类图:

ServerBootstrap和NioEventLoopGroup是关键的类,NioEventLoop (图中没有)这个类是事件驱动的核心实现,被NioEventLoopGroup所持有。

EventLoopGroup包含一组EventLoop,就是nio的事件循环。

如果是ServerSocketChannel的Accept事件,会将新的SocketChannel放到ServerBootstrap的内部类ServerBootstrapAcceptor(这也是一个ChannelInboundHandler的实现)中处理:

就是这句话,把这个child(NioSocketChannel对象)交给了childGroup(EventLoopGroup对象)。

Child的EventLoop拿到这个NioSocketChannel就开始会进行处理。

childGroup.register(child).addListener(new ChannelFutureListener() {
                    @Override
                    public void operationComplete(ChannelFuture future) throws Exception {
                        if (!future.isSuccess()) {
                            forceClose(child, future.cause());
                        }
                    }
                });

netty4 学习及源码纵览_第1张图片

ChannelHandler是注册到Channel上的,按顺序执行channelRead和write操作方法。

ChannelHandler是我们在实现netty应用中,使用最多,也是最为关心的类,我的业务代码处理的类也应该是继承自它。

Encoder和Decoder也是继承于它。

看看与Http相关的,ChannelHandler的类图吧,一般我们的业务类继承ChannelInboundHandlerAdapter。

一般channelHandler的添加顺序为 HttpResponseEncoder, HttpRequestDecoder,HttpSreverInboundHandler(第三个是我们的业务实现类)。

netty4 学习及源码纵览_第2张图片

最后,我们来剖析一下最重要的EventLoop以及ChannelPipeline和ChannelHandlerContext,以NioEventLoop为例。

//NioEventLoop 这个方法 触发了整个ChannelPipeline的生命周期。
private static void processSelectedKey(SelectionKey k, AbstractNioChannel ch) {

这张类图说明了NioEventLoop,如何与NioSocketChannel,以及后续的ChannelPipeline,ChannelHandlerContext的结合。对于NioSocketChannel的读写都是在一个线程,就是workerEventLoopGroup中的EventLoop。

netty4 学习及源码纵览_第3张图片

你可能感兴趣的:(netty4 学习及源码纵览)