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


目录
相关文章
|
6月前
|
Java
【Netty 网络通信】Netty 工作流程分析
【1月更文挑战第9天】Netty 工作流程分析
|
2月前
Netty 与硬件设备交互,下行命令时(服务对设备),如何等待设备响应,再进行业务操作解决方案
Netty 与硬件设备交互,下行命令时(服务对设备),如何等待设备响应,再进行业务操作解决方案
|
6月前
|
Java
Netty实现HTTP服务
Netty实现HTTP服务
57 0
|
6月前
|
开发工具 git
网络编程(三)netty学习demo和笔记和推荐的4本书
网络编程(三)netty学习demo和笔记和推荐的4本书
129 0
|
6月前
|
存储 网络协议 Java
Netty应用实例学习
Netty应用实例学习
47 0
|
6月前
|
编解码 缓存 网络协议
Netty核心功能学习
Netty核心功能学习
61 0
|
6月前
|
编解码 网络协议 Java
Netty基础入门学习
Netty基础入门学习
171 0
|
前端开发 网络协议 API
学习Netty BootStrap的核心知识,成为网络编程高手!
学习Netty BootStrap的核心知识,成为网络编程高手!
192 0
|
Rust Dubbo 网络协议
通过 HTTP/2 协议案例学习 Java & Netty 性能调优:工具、技巧与方法论
通过 HTTP/2 协议案例学习 Java & Netty 性能调优:工具、技巧与方法论
12654 10
|
弹性计算 缓存 网络协议
netty学习(三)
Java NIO 编程
112 0