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


最新文章

  1. [bzoj3932][CQOI2015][任务查询系统] (主席树)
  2. sh3.useradd 添加用户脚本
  3. 【转】Linux C动态内存泄漏追踪方法
  4. LL基本姿势
  5. 初学JQuery笔记
  6. JavaScrip入门(3)
  7. view抖动效果
  8. opencv2.4.4 背景减除算法收集
  9. Tomcat (安装及web实现 基础)
  10. drools 手动创建kmoudle.xml文件
  11. [c/c++] programming之路(27)、union共用体
  12. base64编解码学习及python代码实现
  13. SharePoint 2013 SqlException (0x80131904):找不到Windows NT 用户或组xxxx\administrator
  14. PHP01
  15. Excel Vlookup使用
  16. nginx——控制 Nginx 并发连接数
  17. python FAE
  18. mybatis学习 十五 resultMap标签 一对多
  19. C#构造方法--实例化类时初始化的方法
  20. [原]git的使用(四)---撤销修改

热门文章

  1. 【windows】【php】【nginx】windows 开机自启动nginx php 及nginx php配置
  2. 一个线程中lock用法的经典实例
  3. Oracle常用查询语句
  4. joyoi1957 「Poetize5」Vani和Cl2捉迷藏
  5. hdu2255 奔小康赚大钱 KM 算法
  6. C#Windows服务安装
  7. 【JavaScript 12—应用总结】:弹出登录框
  8. UITableView点击切换状态分析
  9. 算法复习——trie树(poj2001)
  10. STL学习笔记(三) 关联容器