【Netty源码分析】02 Netty Server 启动流程 下_环球快资讯
上面我们分析了initAndRegister()
方法的核心流程,Channel
准备工作基本也都完成了:
(资料图片仅供参考)
Channel
和NioEventLoop
进行了关联;Channel
也注册到Selector
上了;NioEventLoop
线程也启动完成,开始轮询事件、处理事件。这里还遗漏了两个事情:channel
和端口绑定以及channel
向Selector
注册OP_ACCEPT
。这就是在doBind()
方法中另一个重要的方法:doBind0()
中进行完成的。
doBind0
if (regFuture.isDone()) { ChannelPromise promise = channel.newPromise(); doBind0(regFuture, channel, localAddress, promise); return promise;} else { final PendingRegistrationPromise promise = new PendingRegistrationPromise(channel); //register还未完成,则添加listener,待注册完成再执行doBind0()进行server端口绑定 regFuture.addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { Throwable cause = future.cause(); if (cause != null) { promise.setFailure(cause); } else { promise.registered(); doBind0(regFuture, channel, localAddress, promise); } } }); return promise;}
上面代码一大堆,核心就是调用doBind0()
方法,但是执行该方法前必须保证上一步initAndRegister()
方法中执行完成。通过regFuture.isDone()
进行判断,具体设置位置见下:
//AbstractChannel.AbstractUnsafe#register0pipeline.invokeHandlerAddedIfNeeded();// 将指定的promise标记为成功:regFuture.isDone()=true,doBind0()才能开始执行safeSetSuccess(promise);pipeline.fireChannelRegistered();
进行向下跟踪,来到了如下代码处,会发现需要调用channel.bind()
方法,但是不是在当前线程中直接调用,而是封装成task
放入到NioEventLoop
的任务队列taskQueue
中,由NioEventLoop
线程执行:
private static void doBind0( final ChannelFuture regFuture, final Channel channel, final SocketAddress localAddress, final ChannelPromise promise) { channel.eventLoop().execute(new Runnable() { @Override public void run() { if (regFuture.isSuccess()) { channel.bind(localAddress, promise).addListener(ChannelFutureListener.CLOSE_ON_FAILURE); } else { promise.setFailure(regFuture.cause()); } } });}
这时的NioEventLoop
线程是已经启动并开始工作的,所以channel.bind()
这里是可以执行的。
层层调用最终是在pipeline
中的head
这个节点进行处理的:
public final void bind(final SocketAddress localAddress, final ChannelPromise promise) { assertEventLoop(); if (!promise.setUncancellable() || !ensureOpen(promise)) { return; } //还没有绑定端口,isActive()返回false boolean wasActive = isActive(); try { //调用底层java api,将channel绑定到具体端口上 doBind(localAddress); } catch (Throwable t) { safeSetFailure(promise, t); closeIfClosed(); return; } //经过上面绑定端口,这时isActive()=true if (!wasActive && isActive()) { invokeLater(new Runnable() { @Override public void run() { //触发server handler的channelActive()方法 pipeline.fireChannelActive(); } }); } safeSetSuccess(promise);}
这个方法主要完成2件事:
doBind()
:调用java api
,将channel
绑定到具体端口上;pipeline.fireChannelActive()
:将pipeline.fireChannelActive()
放入到NioEventLoop
线程中执行;下面我们再来看下pipeline.fireChannelActive()
:
public void channelActive(ChannelHandlerContext ctx) { ctx.fireChannelActive(); readIfIsAutoRead();}
该方法主要做2件事:
ctx.fireChannelActive()
:触发handler#channelActive()
调用,表示当前channel
已处于激活状态,可以正常工作了;readIfIsAutoRead()
:从名称看就是,如果配置autoRead
,调用readIfIsAutoRead()
直接进行read
操作;readIfIsAutoRead()
会调用tail.read()
,然后一层层往前查找,最终调用的是head#read()
方法。protected void doBeginRead() throws Exception { final SelectionKey selectionKey = this.selectionKey; if (!selectionKey.isValid()) { return; } readPending = true; final int interestOps = selectionKey.interestOps(); // 将SelectionKey当前的操作位与注册操作位进行按位与操作,如果等于0,说明目前并没有设置注册操作位 if ((interestOps & readInterestOp) == 0) { // Server Channel会在这里注册真正的ACCEPT事件 selectionKey.interestOps(interestOps | readInterestOp); }}
channel
绑定好端口后,触发了channelActive()
方法回调,channel
真正进入可以正常工作状态,这时还差最后一步:注册OP_ACCEPT
事件。
总结
这样,Netty
整体启动就全部完成,NioServerSocketChannel
这时就可以正常接收到客户端连接请求。
标签:
相关文章
【Netty源码分析】02 Netty Server 启动流程 下_环球快资讯
上面我们分析了initAndRegister()方法的核心流程,Channel准备工作基本也都完成了:
天天通讯!清明上河图小说简介_清明上河图 小说
1、宋方金的小说《清明上河图》语言洗练、圆润,韵味十足,读之如清风拂面,念之若溪水潺潺。2、阅读的过程中,常常使人忘记文
北京昌平五年审理涉装饰装修合同纠纷八百余件
法治日报讯记者张雪泓实习生范嘉豪记者从北京市昌平区人民法院近日召开的新闻通报会上了解到,2018年至2022年,昌平法院共审理涉装饰装修合同
网信办:及时发现处置网络欺凌行为,防止泄露未成年人隐私的欺凌视频传播
今天,国家互联网信息办公室有关负责人介绍,将:①集中整治自媒体造谣传谣等乱象;②全面清理网络水军违法违规信息;③对网络戾
博鳌亚洲论坛秘书长:要张扬真正的多边主义,在不确定的世界中探寻确定性
博鳌亚洲论坛2023年年会新闻发布会暨期间报告发布会澎湃新闻记者胡志挺摄3月28日,博鳌亚洲论坛2023年年会新闻发布会暨期间报告发布会在海南博
我国软件产业规模突破10万亿元大关 全球热讯
央视网消息:目前,我国软件产业规模已经突破10万亿元大关。其中,14个软件名城业务收入占全国软件业务总收入近80%。位于深圳的这家印制电路板
聚焦:欧比特3月28日快速回调
以下是欧比特在北京时间3月28日09:41分盘口异动快照:3月28日,欧比特盘中快速回调,5分钟内跌幅超过2%,截至9点41分,报11 49元,成交1 74亿
3月27日机构推荐140只个股 云鼎科技等获机构首次关注
e公司数据统计发现,昨日共有140只个股获得机构给予“买入”或“增持”等看好评级,其中,获看好个股数量居前的行业是医药生物、食品饮料、...
天天热讯:明日绿军客战奇才 塔图姆复出 比尔&库兹马继续缺战
明日上午7点,凯尔特人将做客华盛顿挑战奇才。两队官方赛前更新了球队伤病名单。凯尔特人方面:此前因左髋部挫伤缺战一场的塔图姆将迎来复出,
卡布西游刷洗髓丹教程_卡布西游洗髓丹怎么得
1、换用天地灵气在通天河找垂钓的老人换,12瓶换一粒,天地灵气在老头后面就有。2、可以采两次,五指山顶还有一个,可以采
hmcl启动器闪退是怎么回事(hmcl启动器非正常退出)|世界观察
1、得先说一下,我也不知道你具体装了什么mod,然后你给的报错信息内容也有可能并不是直接导致崩溃的部分。2、首先,根据图里这个报错我看到有
热资讯!塑料袋怎样做衣服图片_塑料袋做衣服步骤图解
1、首先,准备一个“垃圾袋”。2、然后,拿出“钩针”。如果没有,可以用“大缝衣针”代替。它的主要用途是“打孔”,只要是能
湖南方盛制药股份有限公司公布受让药品生产技术的最新进展! 天天实时
方盛制药(603998)于3月27日发布晚间公告称,2020年9月10日,湖南方盛制药股份有限公司与湖南康尔佳
【世界新要闻】TikTok听证会后,麦卡锡批评周受资“不诚实”,又被网友骂了
麦卡锡在推文中宣称,“非常令人担忧的是,TikTok的CEO不能诚实地承认我们已经知道的事实,即中国可以访问TikTok的用户数据”。他还声称,...
【财经分析】信用债风险防范 内蒙古做对了什么
内蒙古自治区地方金融监督管理局数据显示,截至目前,内蒙古连续55个月未出现债券市场违约事件,紧紧守住资本市场零违约底线,达到预期目标,
为男篮添新兵!乔帅专程观战“全能王”,内线版崔永熙挤走胡金秋
为男篮添新兵!乔帅专程观战“全能王”,内线版崔永熙挤走胡金秋,乔帅,内线,吴前,周琦,胡金秋,崔永熙,中国男篮,国际篮球赛事,中国篮球联赛,...
环球讯息:透析中心里的年轻人是什么情况
透析中心里的年轻人今天的热度非常高,现在也是在热搜榜上了,那么具体的透析中心里的年轻人是什么情况呢,大家可以一起来看看具体都是怎么回
九联科技:部分产品有应用到人脸识别、车脸识别、视频结构化等相关技术 每日播报
每经AI快讯,有投资者在投资者互动平台提问:AIGC(ArtificialInteligenceGeneratedContent),即采用人工智能技术自动创作、生成内容。
150家期货公司2月净利同比减半 衍生品交易新规酝酿转型契机 要闻
来源:证券时报证券时报记者李言期货公司2月经营业绩近日出炉。中国期货业协会(下称“中期协”)最新数据显示,2月全国150家期货公司实现...
普利诺斯酒店_对于普利诺斯酒店简单介绍
1、普利诺斯酒店位于不莱梅,是家3星级酒店。2、酒店距离“不来梅的城市音乐家”雕像步行12分钟。文章到此就分享结束,希望
全球视讯!宋书玉:今年计划开展白酒企业温室气体核算方法及报告标准等制定工作
中国酒业协会第六届理事会第五次(扩大)会议暨中国酒业协会成立三十周年庆典于2023年3月26日在山东省泰安市举办。主题为:再出发,责任重于泰
游戏板块近期持续回暖 主题ETF领涨
近期,游戏板块持续回暖,相关主题ETF涨幅也尤为明显。数据显示,截至3月24日,游戏主题ETF年内平均回报达44 38%,不仅领涨ETF产品,还有4只产
轻度深覆合矫正多少钱_深覆合矫正大概多少钱_环球快播
1、深覆矫治的费用与错牙合畸形的复杂程度和矫治器的类型有关。2、出现深覆时,上颌前牙舌侧覆盖下颌前牙唇侧2 3以上,下颌
新车报讯:宝马中国/华晨宝马捐1100万援助河南防汛救灾及灾后重建工作
汽车现在已经越来越普及,基本上都快实现每家每户都有汽车了,那么汽车这么多的情况之下,我们在用车的过程当中肯定也就会遇到各
每日焦点!国家发改委主任:我国将防范化解金融和房地产等领域风险
3月26日电,国家发改委主任郑栅洁今天在中国发展高层论坛2023年年会上说,我国将统筹发展与安全,以新安全格局保障新发展
世界新资讯:生化危机4重制版如何制作物品
制作在生化危机4重制版中起着至关重要的作用。它允许您创建有价值的资源,包括治疗对象和弹药。当你仔细探索这个生存恐怖中的每