• Netty源码 服务端的启动


    最近一直在看netty,看完之后就想做点笔记。可是实在是太忙了,挤了还要几个晚上终于挤出来了

    上图是服务端的实例代码。大致的流程先梳理一遍。

    首先会执行 用于创建两个线程组,boosGroup用于接受外部连接,对 SelectionKey.OP_ACCEPT 感兴趣

    ,workGroup用于处理io操作,内部,每当有新连接进来的时候boosGroup 都会把连接封装成一个channel 交给workGroup 去处理。

    我们再看 NioEventLoopGroup 的构造方法,一直点进去,实际上调用的 MultithreadEventExecutorGroup 

     可以看到 这两行代码实际就是创建两个包含 NioEventLoop 对象的数组。NioEventLoop对象我们后面介绍。

    ServerBootstrap 是一个辅助类,主要用于设置各种配置参数,

    .group(bossGroup, workerGroup) 

    就是上面我们创建的两个线程组,bossGroup的作用就是不断地accept到新的连接,将新的连接丢给workerGroup来处理

    .channel(NioServerSocketChannel.class) 

    表示服务端启动的是nio相关的channel,channel在netty里面是一大核心概念,可以理解为一条channel就是一个连接或者一个服务端bind动做

    .childHandler(new ChannelInitializer<SocketChannel>)表示一条新的连接进来之后,该怎么处理

    上面的几行代码都是做相应配置。

    真正的关键在于bind方法

    我们一路点击进去。这个干了三件事 初始化,注册,绑定端口。

    我们先看 initAndRegister

    总共三步,创建channel,初始化,注册。

    1.创建 反射调用,这里的clazz是在中设置的,所以这里创建出的是NioServerSocketChannel

    2.初始化 

     

    初始化只做了两件事

    1. 将配置属性设置到channelConfig或者channel 中
    2. 加入新连接处理器

    p.addLast()向serverChannel的流水线处理器中加入了一个 ServerBootstrapAcceptor,从名字上就可以看出来,这是一个接入器,专门接受新请求,把新的请求扔给某个事件循环器

    3.注册

    将该条channel绑定到一个selector上去,一个selector被一个reactor线程使用,后续该channel的事件轮询,以及事件处理,异步task执行都是由此reactor线程来负责

    现在我们的channel已经和reactor线程绑定在一起了,现在就剩下最后一步了,完成端口的绑定。

    netty通过异步线程的方式完成端口绑定,这段代码比较难找,最终会来到 io.netty.channel.DefaultChannelPipeline.HeadContext#bind

     最终调到了jdk里面的bind方法,这行代码过后,正常情况下,就真正进行了端口的绑定。

  • 相关阅读:
    11个Linux基础面试问题
    OSI模型
    戴文的Linux内核专题:10配置内核(6)
    面向对象实验四(输入输出流)
    计算机程序的思维逻辑 (2)
    计算机程序的思维逻辑 (1)
    java基础3.0:Java常用API
    java基础2.0:Object、Class、克隆、异常编程
    java基础1.0::Java面向对象、面向对象封装、抽象类、接口、static、final
    Ajax工作原理(转)
  • 原文地址:https://www.cnblogs.com/xmzJava/p/9425440.html
Copyright © 2020-2023  润新知