Netty流程学习一-netty启动服务

简介: 问题:我们的线程:openSelector在什么时候创建的。在创建NioEventLoop的时候,创建openSelector。什么时候创建severSocketChannel、初始化serverSocketChannel,同时给serverSocketChannel从bossGroup中选择一个NioEventLoop创建serverSocketChannel是在initAndRegister的时候,通过泛型+放射+工厂的方式创建serverSocketChannel。而初始化则是设置channelOptions的相关参数信息、设置属性信息,同时通过channel的pipeline方

问题:我们的线程:openSelector在什么时候创建的。

在创建NioEventLoop的时候,创建openSelector。

什么时候创建severSocketChannel、初始化serverSocketChannel,同时给serverSocketChannel从bossGroup中选择一个NioEventLoop

创建serverSocketChannel是在initAndRegister的时候,通过泛型+放射+工厂的方式创建serverSocketChannel。

而初始化则是设置channelOptions的相关参数信息、设置属性信息,同时通过channel的pipeline方法,添加一个channelInitializer,负责添加一个ServerBootstrapAcceptor Handler,添加完后,自己就移除了,可以看到初始化的过程会将channel、当前的线程组、当前的handler、当前的options、当前的attrs放入。

判断当前的eventLoop是不是NioEventLoop中的线程,如果是,则直接进行注册,否者需要执行eventLoop的execute操作,重写run方法,进行register0操作,此时会设置标识,方便注册后,设置对应的标识neverRegistered = false和registered = true。执行注册操作。

boss线程什么时候将serverSocketChannel注册到选择的NioEventLoop的selector,绑定地址启动,注册接收连接事件到selector上。

在AbstractNioChannel的doRegister中执行javaChannel().register(eventLoop().unwrappedSelector(), 0, this)拿到的结果是selectionKey,也即此时将eventLoop注册到了NioEventLoop的selector上。等着register完成来通知再执行bind。此时会添加监听。当promise的registered属性为true时,则执行doBind0操作。

此时会走到doBind0操作,此时会拿到channel的eventLoop的execute的run方法,执行bind操作,此时会走到pipeline中,此时可以看到pipeline中的操作中会包含head和tail,也即入站和出站的形式,可以看到headContext中的bind操作,在DefaultChannelPipe中,有bind方法unsafe.bind(localAddress, promise),此时会看到在NioServerSocketChannel中的doBind中会通过javaChannel中的bind方法进行绑定地址操作,然后执行。绑定后,才开始激活channelActive(ChannelHandlerContext ctx)。此时会执行两个操作:fireChannelActive和readIfIsAutoRead两个方法,此时可以看到read(ChannelHandlerContext ctx),此时会unsafe.beginRead(),这个时候在AbstractChannel中看到doBeginRead中执行注册interestOps和readInterestOps,此时会将readInterestOps=16这个事件注册到selectionKey中。

其流程:

微信图片_20221214030636.jpg


目录
相关文章
|
3月前
|
Java
【Netty 网络通信】Netty 工作流程分析
【1月更文挑战第9天】Netty 工作流程分析
|
3月前
|
开发工具 git
网络编程(三)netty学习demo和笔记和推荐的4本书
网络编程(三)netty学习demo和笔记和推荐的4本书
115 0
|
3月前
|
存储 网络协议 Java
Netty应用实例学习
Netty应用实例学习
31 0
|
3月前
|
编解码 缓存 网络协议
Netty核心功能学习
Netty核心功能学习
45 0
|
3月前
|
编解码 网络协议 Java
Netty基础入门学习
Netty基础入门学习
83 0
|
10月前
|
前端开发 网络协议 API
学习Netty BootStrap的核心知识,成为网络编程高手!
学习Netty BootStrap的核心知识,成为网络编程高手!
166 0
|
Rust Dubbo 网络协议
通过 HTTP/2 协议案例学习 Java & Netty 性能调优:工具、技巧与方法论
通过 HTTP/2 协议案例学习 Java & Netty 性能调优:工具、技巧与方法论
12618 5
|
弹性计算 缓存 网络协议
netty学习(三)
Java NIO 编程
94 0
|
Java
netty学习(二)
Java BIO 编程
113 0
netty学习(二)
|
分布式计算 Dubbo 网络协议
netty学习(一)
netty的介绍和应用场景
155 0
netty学习(一)