服务启动
AbstractBootstrap.dobind()
initAndRegister()
channelFactory.newChannel()通过ChannelFactory创建一个Channel,channelFactory默认表示为ReflectiveChannelFactory里面的constructor,反射创建的类为NioServerSocketChannel
NioServerSocketChannel():上面方法会默认执行该无参构造方法
ServerSocketChannel newSocket(SelectorProvider provider):NioServerSocketChannel的构造方法会自动调用该方法,会创建Java原生ServerSocketChannel
NioServerSocketChannel(ServerSocketChannel channel):调用该构造方法,注册感兴趣的事件为读
protected AbstractNioChannel(Channel parent, SelectableChannel ch, int readInterestOp) :调用该方法,设置channel为非阻塞
AbstractChannel(Channel parent):创建id、unsafe,pipeline(默认为双向链表)
void init(Channel channel):用来设置参数,添加handler,同时添加一个ServerBootstrapAcceptor
config().group().register(channel):调用bossGroup注册channel
next().register(channel);next实际为线程池选择器
AbstractUnsafe#register0():
protected void doRegister():key,将EventLoop中的Selector与Java原生的Channel绑定在一起,并返回这个SelectionKey
AbstractBootstrap#doBind0
bstractChannel#bind(java.net.SocketAddress, io.netty.channel.ChannelPromise):最终调用java原生的channel绑定到一个本地地址
netty接收新连接
channelRead ():接收新连接的时候调用。Netty 底层接收新连接跟 Java 原生 Channel 是一致的,而且它的 select 是在 NioEventLoop 的 run () 方法中
NioEventLoop 的 run ():执行了nio的select方法,同时执行selectKeys方法
NioEventLoop.select():进入阻塞方法
NioEventLoop.processSelectedKeys():遍历selectedKeys,将NioServerSocketChannel以附件的形式取出
NioServerSocketChannel#doReadMessages():调用Java原生的aacept()方法创建一个SocketChannel
ServerBootstrapAcceptor:往子 ChannelPipeline 中添加子 ChannelHandler