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


目录
相关文章
【Netty 网络通信】Netty 工作流程分析
【1月更文挑战第9天】Netty 工作流程分析
|
5月前
|
算法 Java 容器
Netty源码—4.客户端接入流程
本文主要介绍了关于Netty客户端连接接入问题整理、Reactor线程模型和服务端启动流程、Netty新连接接入的整体处理逻辑、新连接接入之检测新连接、新连接接入之创建NioSocketChannel、新连接接入之绑定NioEventLoop线程、新连接接入之注册Selector和注册读事件、注册Reactor线程总结、新连接接入总结
|
5月前
|
编解码 安全 Java
Netty源码—1.服务端启动流程
本文主要介绍了服务端启动整体流程及关键方法、服务端启动的核心步骤、创建服务端Channel的源码、初始化服务端Channel的源码、注册服务端Channel的源码、绑定服务端端口的源码、服务端启动流程源码总结。
|
5月前
|
前端开发 网络协议 应用服务中间件
Netty基础—7.Netty实现消息推送服务
本文详细介绍了如何使用Netty实现HTTP服务器、WebSocket以及基于WebSocket的消息推送系统。首先,通过解析HTTP请求和响应消息,展示了Netty在性能和可靠性上的优势,并提供了具体代码示例。接着,分析了HTTP协议的弊端及Ajax短轮询的不足,引出WebSocket全双工通信的优势,包括连接建立、数据处理逻辑与ping-pong探测等。最后,构建了一个完整的消息推送系统,涵盖PushServer、运营客户端与浏览器客户端的交互过程,实现了全连接推送和实时消息传递。
|
5月前
|
Java 开发者 索引
Netty基础—6.Netty实现RPC服务
本文详细介绍了RPC(远程过程调用)的相关概念及其实现细节,涵盖动态代理、Netty客户端和服务端处理、编码解码器以及超时功能的实现。
Netty 与硬件设备交互,下行命令时(服务对设备),如何等待设备响应,再进行业务操作解决方案
Netty 与硬件设备交互,下行命令时(服务对设备),如何等待设备响应,再进行业务操作解决方案
306 1
|
Rust Dubbo 网络协议
通过 HTTP/2 协议案例学习 Java & Netty 性能调优:工具、技巧与方法论
通过 HTTP/2 协议案例学习 Java & Netty 性能调优:工具、技巧与方法论
12797 86
|
Java
Netty实现HTTP服务
Netty实现HTTP服务
108 0
|
开发工具 git
网络编程(三)netty学习demo和笔记和推荐的4本书
网络编程(三)netty学习demo和笔记和推荐的4本书
211 0
|
存储 网络协议 Java
Netty应用实例学习
Netty应用实例学习
127 0