首页 >资讯 > > 正文

环球关注:【Netty源码分析】02 Netty Server 启动流程 下

腾讯云 2023-03-28 12:17:28

上面我们分析了initAndRegister()方法的核心流程,Channel准备工作基本也都完成了:

ChannelNioEventLoop进行了关联;Channel也注册到Selector上了;NioEventLoop线程也启动完成,开始轮询事件、处理事件。

这里还遗漏了两个事情:channel和端口绑定以及channelSelector注册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这时就可以正常接收到客户端连接请求。

上一篇:天天微资讯!扬州老火车站生活记忆馆“4·18”崭新亮相 下一篇:最后一页
x
推荐阅读

环球关注:【Netty源码分析】02 Netty Server 启动流程 下

2023-03-28

天天微资讯!扬州老火车站生活记忆馆“4·18”崭新亮相

2023-03-28

阿里达摩院发布多模态专利 意图识别可丰富人机对话方式

2023-03-28

3月28日生意社DMF基准价为5475.00元/吨

2023-03-28

新洋丰03月27日被深股通减持60.11万股|全球今热点

2023-03-28

浦东新区组织召开2023年防汛防台专项应急演练部署会|每日观察

2023-03-28

今日热搜:棱柱的性质_棱柱

2023-03-28

中方关闭美思明智集团北京办事处并拘留5名中国籍员工?外交部回应 每日时讯

2023-03-27

全球视点!征纳互动 税务“蓝”助力乡村产业“红”

2023-03-27

焦点信息:今日游戏人生怎么打开(游戏人生怎么开通啊)

2023-03-27

大宗交易:元成股份成交1075.1万元,折价12.11%(03-27)

2023-03-27

天天亮点!北京城市学院毕业后好找工作吗 哪些专业好就业

2023-03-27

天天看点:手机里的数据如何删才算真正安全

2023-03-27

人工智能引擎排名(人工智能引擎)_天天精选

2023-03-27

环球新资讯:森林草原大火的影响_森林草原大火的影响简述

2023-03-27

荣耀正在开发自己版本的Apple动态岛功能名为MiniCapsule 热推荐

2023-03-27

泰康人寿与北京大学经济学院签约战略合作伙伴

2023-03-27

槽枥

2023-03-27

不锈钢刮花怎么处理_汽车轮毂刮花了怎么处理_世界热点评

2023-03-27

全球快资讯丨武汉邓南街道开展生活垃圾分类“五进”系列活动

2023-03-27

新华时论|既要“水韵江苏”又要“水运江苏”_速递

2023-03-26

短视频“引流”助推旅游市场复苏 多地景区游客量增长明显

2023-03-26

芦荟的功效与用法_新鲜芦荟的功效与用法 世界速讯

2023-03-26

50国中华文化爱好者诵读儒家经典 推动中华文化“走出去”_全球最新

2023-03-26

张良怎么死的 原来是这样

2023-03-26

关注!高新CID一宗111亩住宅用地规划公示! 天天速递

2023-03-26

辽宁省六项举措推进会展行业全面复苏

2023-03-26

咒术回战第二季出了吗_咒术回战第二季什么时候出

2023-03-26

云南丽江旅游攻略自助游

2023-03-26

前沿热点:蘑菇丁电脑版登录入口(蘑菇丁电脑版登录入口)

2023-03-26

枪王回春器798元_枪王回春器 今日聚焦

2023-03-25

茶淀街道邀请智囊团 助力农产品上“云端”_全球观察

2023-03-25

拉埃尔·恩泽扎|全球聚焦

2023-03-25

语笑嫣然的古代小说|全球快播报

2023-03-25

孩子沉迷游戏,民警帮忙挽回“钱袋子”_世界聚焦

2023-03-25

苹果CEO库克:非常开心能回到中国,每次来中国都很有收获

2023-03-25

全球快报:打造服务高质量发展的新时代产业工人队伍 萧山区新增100名职业技术带头人

2023-03-25

世界时讯:与世无争代表什么动物

2023-03-25

黄荷凤:利用创新医疗手段提高出生人口健康率

2023-03-25

博的成语与短语_博的成语

2023-03-25

微速讯:平凡职业造就世界最强的观后长评

2023-03-25

城市交通“脉搏”如何保证畅通无阻?这场展会给出诸多答案

2023-03-24

世界微资讯!吃菠萝蜜的正确吃法

2023-03-24

【app同步】志愿文化 | 跨越山海的追光者

2023-03-24

环球时讯:八步区:助廉“三举措”延伸“清廉家庭+”效应

2023-03-24

黄金时间·每日论金(3月24日):黄金多头动能强劲 但警惕冲高回落风险|速递

2023-03-24

拉伸试样标距仪_当前视点

2023-03-24

和讯个股快报:2023年03月24日,14时34分四川长虹(600839)14:33分,尾盘涨停板打开

2023-03-24

焦点热文:《回响》:越过欲望与情感的泥沼

2023-03-24

最新消息:绿头鸭是什么鸭

2023-03-24

环球信息:IRENA表示2022年全球新增191GW太阳能 --> IRENA表示2022年全球新增191GW太阳能

2023-03-24

“95后”地铁女司机张晓歌:做居民出行的安全“驶”者_今日精选

2023-03-24

【环球聚看点】商务部启动2023年“中华美食荟”活动

2023-03-24

常熟银行(601128):微贷进一步做小做散 ROE开启回升之路 世界头条

2023-03-24

当前讯息:Linux安装elasticsearch-head

2023-03-24

百事通!车位地锁价格_车位地锁

2023-03-24

全球快看:正月十五有什么忌讳吗 正月十五为什么不能出门

2023-03-23

天天头条:平舆县玉皇庙乡开展街道环境卫生整治 助力乡村人居环境改善

2023-03-23

苹果连接电脑怎么设置信任(苹果连接电脑)|速讯

2023-03-23

高鹏矿业(02212.HK)预计年度收入增加约158.7%

2023-03-23

全球速看:浪漫到极致的句子_浪漫的含义

2023-03-23

中小VC艰难求生 数万亿“僵尸基金”进退两难

2023-03-23

今日热闻!塑化剂对人的危害是什么

2023-03-23

女人再懒,过年也少剪短发,这4款“丝巾长发”,时髦知性显脸小 看热讯

2023-03-23

新能源汽车充电时为何要交停车费 专家:可防止充电之后不挪窝-全球热资讯

2023-03-23

致死率高达60%,近半感染者90天内死亡,耳念珠菌到底可不可怕?我们能做什么?-全球要闻

2023-03-23

金安国纪3月23日盘中涨幅达5%

2023-03-23

cf大炮是什么枪 热门

2023-03-23

巴西央行宣布维持13.75%基准利率不变

2023-03-23

音频线规格型号图片_音频线规格型号 关注

2023-03-23

lol内置语音听不到队友说话_lol内置语音连不上 热点在线

2023-03-22

3月再不吃它就晚了!一拌一煎就出锅,错过就要等明年|天天微头条

2023-03-22

资讯推荐:流行手机来电铃声,最流行的来电铃声是什么

2023-03-22

马自达这次真急了!CX4瞧了愤愤不平,17万起马自达狠狠打脸

2023-03-22

今日热门!联防控!滇黔川渝藏湘桂7省份森林草原防火联席会议召开

2023-03-22

培养孩子的学习自主性,我有爱果乐儿童桌椅_每日看点

2023-03-22

光环新网3月22日快速回调|当前消息

2023-03-22

当前头条:英超官博对比曼市双“大脑”数据:丁丁4球12助攻,B费5球6助攻

2023-03-22

【新时代 新征程 新伟业】子长:小桑蚕“撬动”致富大产业

2023-03-22

科威尔:3月21日融资买入37.48万元,融资融券余额1648.84万元-通讯

2023-03-22

世界快报:迁徙是什么意思_迁徙是何意思

2023-03-22

天天亮点!欧陆通(300870):公司累计回购股份数量165.53万股,已支付资金总额约6260.07万元

2023-03-22

喝绿茶有什么好处和坏处_喝绿茶有什么好处|世界要闻

2023-03-21

让山寨官方机构账号无处遁形——从严整治“自媒体”乱象②

2023-03-21

全球时讯:舞钢农商银行:凝心聚力再突破 团结实干建新功

2023-03-21

长缆科技3月21日快速回调|全球最资讯

2023-03-21

海淀区气象台发布大风蓝色预警【IV/一般】【2023-03-21】

2023-03-21

沙尘暴预警升级,明晨影响北京!空气质量何时好转?最新预报——_环球实时

2023-03-21

六年级上册数学同步练习册河北版_六年级上册数学同步练习册

2023-03-21

观热点:Spears:勇熊是目前联盟最好的一组对决 他们之间真的存在着仇恨

2023-03-21

天天微速讯:思维科学是什么意思_思维科学

2023-03-21

当日快讯:龙虎榜 | 恒久科技今日跌4.5%,机构合计净卖出187.88万元 全球聚焦

2023-03-20

天天动态:振动方程如何变成波动方程_振动方程和波动方程怎么转换

2023-03-20

2023枣庄二调试题及答案各科解析汇总_更新中

2023-03-20

天天通讯!贝仙吉犬_贝仙

2023-03-20

小米cc11支持红外吗

2023-03-20

当前快讯:网购牙齿矫正器,真的靠谱吗?

2023-03-20

浙商证券:给予中伟股份增持评级_世界快播报

2023-03-20

龟头上有红色斑块不痛不痒是怎么回事_龟头脱皮痒是性病吗_世界今日报

2023-03-20

高平小区租二手房_高平租房信息|当前要闻

2023-03-19