Netty3 源代码分析 - NIO server绑定过程分析

     一个框架封装的越好,越利于我们高速的coding。可是却掩盖了非常多的细节和原理。可是源代码可以揭示一切。

服务器端代码在指定好ChannelFactory。设定好选项。而后Bootstrap.bind操作就会开启server。接受对端的连接。

所以有必要对这后面的过程分析清楚,下图是关键流程。先是构建一个默认的Pipeline,为我们接下来要创建的监听通道服务。这个Pipeline里面会增加一个Binder的上行事件处理器。接下来创建了至关中的NioServerSocketChannel,在构造的过程中,调用了NIO中ServerSocketChannel的open方法打开套接字,设为非堵塞,然后会触发一个OPEN的上行
ChannelStateEvent(为后文买下伏笔),接下来Bootstrap就会等待着成功的信号。还有一方面,在将Binder这个Handler增加bossPipeline的时候,它就已经准备好运转了,在收到一个OPEN事件后,就会设置套接字选项,运行真正的套接字绑定,而后Future.setSuccess就会让前面的bind方法成功返回,開始运转。

代码例如以下:
public void channelOpen(
ChannelHandlerContext ctx, ChannelStateEvent evt) {

            try {
                 // 内部类能够訪问外部类的方法 。如 getPipelineFactory()。
                evt.getChannel().getConfig().setPipelineFactory(getPipelineFactory());

                // Split options into two categories: parent and child.
                Map<String, Object> allOptions = getOptions();
                Map<String, Object> parentOptions = new HashMap<String,
Object>();
                for (Entry<String, Object> e: allOptions.entrySet())
{
                    if (e.getKey().startsWith( "child."))
{
                        childOptions.put( e.getKey().substring(6), e.getValue());
                    } else if (!"pipelineFactory" .equals(e.getKey()))
{
                        parentOptions.put(e.getKey(), e.getValue());
                    }
                }

                // Apply parent options.
                evt.getChannel().getConfig().setOptions(parentOptions);
            } finally {
                ctx.sendUpstream(evt);
            }

            //============ 真正的绑定套接字 =======
            evt.getChannel().bind( localAddress).addListener( new ChannelFutureListener()
{
                public void operationComplete(ChannelFuture
future) throws Exception {
                    if (future.isSuccess()) {
                      // 这里触发了 bind的成功
                        bindFuture.setSuccess();
                    } else {
                        bindFuture.setFailure(future.getCause());
                    }
                }
            });
        }






更具体的理解看Netty3 源代码凝视,见Github


Netty3 源代码分析 - NIO server绑定过程分析的更多相关文章

  1. Zico源代码分析:执行启动过程分析和总结

    事实上已经有童鞋对Zico的源代码和执行过程进行了总结,比如:http://www.cnblogs.com/shuaiwang/p/4522905.html.这里我再补充一些内容. 当我们使用mvn ...

  2. nginx源代码分析--高性能server开发 常见的流程模型

    1.高性能server 对于高性能server对于.处理速度和占用空间小是典型特性.特别是当server经验C10K问题的时候(网络server在处理数以万计的client连接时.往往出现效率低下甚至 ...

  3. Android应用程序绑定服务(bindService)的过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6745181 Android应用程序组件Serv ...

  4. Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6633311 在上一篇文章中,我 们分析了And ...

  5. Hadoop源代码分析

    http://wenku.baidu.com/link?url=R-QoZXhc918qoO0BX6eXI9_uPU75whF62vFFUBIR-7c5XAYUVxDRX5Rs6QZR9hrBnUdM ...

  6. Android应用程序进程启动过程的源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址: http://blog.csdn.net/luoshengyang/article/details/6747696 Android 应用程序框架层创 ...

  7. Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重劳动成果] 1 背景 之所以写这一篇博客的原因是由于之前有写过一篇<Android应用setCont ...

  8. Tomcat7.0源代码分析——启动与停止服务原理

    前言 熟悉Tomcat的project师们.肯定都知道Tomcat是怎样启动与停止的. 对于startup.sh.startup.bat.shutdown.sh.shutdown.bat等脚本或者批处 ...

  9. Hadoop源代码分析(完整版)

    Hadoop源代码分析(一) 关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http:// ...

随机推荐

  1. vue-music:歌词的其他功能

    由于歌词的播放需要歌曲播放,切换歌曲,歌曲的播放模式等等有关联,因此,需要在这几处处理相关问题 1.循环播放回不到开始位置 loop() { this.$refs.audio.currentTime ...

  2. verilog RTL 编程实践之五

    How to build and test a module 1.test have: generate .stimulus .check .respose 2.only one monitor ca ...

  3. 关于Linux下使用expdp和impdp命令对Oracle数据库进行导入和导出操作

    说明:本次导入和导出采用expdp和impdp命令进行操作,这2个命令均需要在服务器端进行操作 http://www.cnblogs.com/huacw/p/3888807.html 一.    从O ...

  4. Knockout v3.4.0 中文版教程-11-控制文本内容和外观-text绑定

    2. text绑定 目的 text绑定把传入的参数通过关联的DOM元素来显示文本值. 通常这对像<span>或<em>标签等使用,但技术上你可以对任何元素使用该绑定. 例子 T ...

  5. [工具使用] visualvm 通过jmx不能连接

    远程服务器,通常配置下jmx,然后用visualvm连接然后监控. 但昨天自己的一台测试服务器上,正确配置了jmx还是不能连接上去. 后来参考了 https://bjddd192.github.io/ ...

  6. SQL server 数据库备份至服务器本地磁盘和其他服务器磁盘

    前言 因工作需要将数据库每日备份至服务器本地磁盘和其他服务器磁盘,对网上的例子进行改造,解决了SQL server数据库备份的问题. 一.将指定数据库备份到本地 将数据库affair_stydy全备份 ...

  7. 编辑被标记为“只读”的Word文档

    从邮件接收到的Word文档,打开时总是被标记为“只读”,在阅读时对其进行编辑,但不能保存,会提示文档为只读的.要想对其进行编辑并保存,需要进行一定的操作. 进入文件所在的目录,鼠标右键点击Word文档 ...

  8. 全库修改SQL Server现有排序规则

    近日,在项目Debug过程中发现了SQL Server排序规则冲突的问题. 由于原数据库是从英文环境的SQL中生成的,其排序规则为“SQL_Latin1_General_CP1_CI_AS”,备份到本 ...

  9. AS创建工程结构

  10. 常州模拟赛d6t3 噪音

    FJ有M个牛棚,编号1至M,刚开始所有牛棚都是空的.FJ有N头牛,编号1至N,这N头牛按照编号从小到大依次排队走进牛棚,每一天只有一头奶牛走进牛棚.第i头奶牛选择走进第p[i]个牛棚.由于奶牛是群体动 ...