读Netty源码总结
Posted 非让修改账号名称
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读Netty源码总结相关的知识,希望对你有一定的参考价值。
创建两个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上,然后调用ChannelInitializer把ServerBootstrapAcceptor添加到NioServerSocketChannel的ChannelPipline中,此时mainRactor的这个死循环就能够感知到客户端的连接事件了;
当有客户端连接到服务端时,上面的死循环就能够获取到对应的SelectionKey,首先初始化NioSocketChannel,把它设置为非阻塞,初始化Pipline对象,在Pipline中设置ServerBootstrap.childHandler()方法制定的ChannelInitializer。
然后这个NioSocketChannel就交给ServerBootstrapAcceptor处理,处理过程就是把NioSocketChannel注册到subReactor的EventLoop上,同样的道理,内部也会开启一个死循环,内部把NioSocketChannel注册到Selector上,然后调用selector.select(timeout)监听IO事件;
当有READ事件时,调用自定义的ChannelHandler进行处理;
以上是关于读Netty源码总结的主要内容,如果未能解决你的问题,请参考以下文章