netty源码详解。
1、Netty服务端启动。
首先创建两种类型的NioEventLoopGroup对象。
ServerBootstrap()(空方法)。
2、通过group(),将两个线程配置进Channel。
3、端口的绑定。
bind()(入口),端口的绑定。
4、netty服务端启动分为4个过程。
4.2、这个实际上是调用jdk底层的API,去创建jdk的Channel,然后netty封装成自己的Channel,同时创建基本组件,绑定在子Channel上面。
4.3、netty会基于子Channel做一些初始化的工作,初始化基本属性,以及添加一些逻辑处理器。
4.4、netty将底层的Channel注册到事件轮询器,selector上面,并把服务端的Channel作为, 绑定在对应在jdk底层服务端的Channel,这样的话,在后续有事件轮询出来之后,就可以直接拿到etxment,etxment就是netty封装jdk底层的Channel。
4.5、调用jdk底层的API,对本地端口的监听。
这四个步骤完成后,netty服务端就启动完成了。
5、详细说明netty服务端启动过程。
5.2、创建服务端Channel,首先从bind()代码开始,调用到initAndRegister(),调用netChannel(),通过newChannel创建服务端channel。
5.3、bind()(服务端创建的入口)。
5.4、initAndRegister()(创建服务端的channel)。
6、channelFactory在哪里初始化的?
6.2、在channel(),把channelClass封装成一个ReflectiveChannelFactory,通过channelClass,通过反射的方式,去创建ReflectiveChannelFactory对象。
6.3、channelClass就是传来的NioServerSocketChannel.class,通过反射调用这个类的构造函数。
7、接下来看NioServerSocketChannel类中的构造函数。
7.2、newSocket(),进入NioServerSocketChannel类,查看NioServerSocketChannel构造函数。
7.3、newSocket创建jdk底层的channel。
7.4、provider调用jdk底层的openServerSocketChannel,去创建服务器端的channel。
7.5、返回了jdk底层创建的channels对象。
7.6、NioServerSocketChannelConfig()(tcp参数的配置类)。
7.7、将jdk创建完成的ServerSocketChannel 传进去作为这个NioServerSocketChannelConfig()的构造函数,这个config主要是后续对Channel的tcp底层进行获取。
7.8、调用父类的构造函数,第一个configureBlocking(false)。
7.9、ch就是newSocket()创建出来jdk底层的channel。
8、AbstactChannel(),服务端channel和客户端的channel都继承与AbstactChannel类,AbstactChannel就是对channel一个抽象,不管是服务端还是客户端的channel,都会有id,unsafe,pipeline三个属性(id对应的channel的唯一标识,unsafe就跟tcp的读写,底层的操作,pipeline跟服务端和客户端逻辑相关的链)。