读Netty源码总结

Posted 非让修改账号名称

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读Netty源码总结相关的知识,希望对你有一定的参考价值。

http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf

  • 创建两个EventLoopGroup,一个是mainReactor,一个是subReactor,mainReactor用于处理客户端连接,subReactor用于处理IO读写;

  • 通过ServerBootstrap配置两个EventLoopGroup、Channel、ChannelInitializer以及一些TCP参数;

  • 调动ServerBootstrap.bind(port)方法开启服务端启动流程;

  • 通过反射创建NioserverSocketChannel的实例、设置其为非阻塞模式,并初始化ChannelPipline;

  • 在ChannelPipline上设置ChannelInitializer(这个ChannelInitializer用于注册)

    ServerBootstrapAcceptor类型的ChannelHandler)

  • 将NioServerSocket交给mainReactor中的EventLoop(这个EventLoop的作用有两个,当NioServerSocketChannel的注册过程没有完成时,它用来执行注册任务,如果注册完成,用来在Selector上监听OPT_ACCEPT事件);

  • EventLoop内部启动一个SingleThreadEventExecutor类型的线程,并进入死循环状态;

  • 这个线程首先完成NioServerSocketChannel注册任务,注册过程首先将Channel注册到Selector上,然后调用ChannelInitializerServerBootstrapAcceptor添加到NioServerSocketChannel的ChannelPipline中,此时mainRactor的这个死循环就能够感知到客户端的连接事件了;

  • 当有客户端连接到服务端时,上面的死循环就能够获取到对应的SelectionKey,首先初始化NioSocketChannel,把它设置为非阻塞,初始化Pipline对象,在Pipline中设置ServerBootstrap.childHandler()方法制定的ChannelInitializer。

  • 然后这个NioSocketChannel就交给ServerBootstrapAcceptor处理,处理过程就是把NioSocketChannel注册到subReactor的EventLoop上,同样的道理,内部也会开启一个死循环,内部把NioSocketChannel注册到Selector上,然后调用selector.select(timeout)监听IO事件;

  • 当有READ事件时,调用自定义的ChannelHandler进行处理;


以上是关于读Netty源码总结的主要内容,如果未能解决你的问题,请参考以下文章

netty源码之读取数据

netty源码之读取数据

netty源码之读取数据

netty源码之接收连接

netty源码之接收连接

netty源码之接收连接