课程大纲
1、问题思考
2、服务端启动流程
3、源码执行流程
1、问题思考
1)服务端的socket在哪里初始化?
2)服务端在哪里accpet客户端连接?
2、服务端启动流程
1.服务端通过ServerBootStrap.bind()方法启动
2.服务端NioServerSocketChannel通过工厂反射创建,并初始化NioServerSocketChannelConfig、id,unsafe()和ChannelPipeLine,配置Channel为非阻塞。
3.服务端NioServerSocketChannel初始化,完成服务端Channel参数、属性和ChannelHandler配置,以及客户端Channel参数、属性和ChannelHandler配置。
4.服务端NioServerSocketChannel注册到NioEventLoop线程的Selector上,并将自身作为attachment属性绑定到该Selector上。
5.服务端NioServerSocketChannel绑定本地端口,监听NioEventLoop上Selector的OP_ACCEPT事件,接收来自客户端的连接请求。
3、源码执行流程
源码执行流程
1.服务端通过ServerBootStrap.bind()方法启动,最终调用父类的AbstractServerBootStrap.bind()
ServerBootStrap.bind()->AbstractServerBootStrap.bind()->AbstractServerBootStrap.doBind()
程序进入AbstractServerBootStrap.initAndRegister(),进行Channel的创建、初始化和注册
2.服务端通过newChannel()方法完成Channel创建
channel = channelFactory.newChannel();
3.服务端通过ServerBootStrap.init(Channel channel)方法完成Channel初始化
init(channel);
4.服务端通过register()方法完成Channel注册
ChannelFuture regFuture = config().group().register(channel);
5.服务端通过doBind0()方法完成Channel的端口绑定
doBind0(regFuture, channel, localAddress, promise);
网友评论