`
bzhjian
  • 浏览: 6704 次
  • 性别: Icon_minigender_1
  • 来自: 桂林
社区版块
存档分类
最新评论

Netty4源码分析—ServerSocketChannel注册到Selector

阅读更多

一、生成serversocketchannel

 

     ServerBootstrap设置channel类型 bootstrap.channel(NioServerSocketChannel.class)时,ServerBootstrap的父类AbstractBootstrap的初始ChannelFactory的对象,ChannelFactory的作用是生成ServerSocketChannel对象,channel方法代码:

 

public B channel(Class<? extends C> channelClass) {
        if (channelClass == null) {
            throw new NullPointerException("channelClass");
        }
        return channelFactory(new BootstrapChannelFactory<C>(channelClass));
}

 

    BootstrapChannelFactoryAbstractBootstrap的内部类。

 

二、将serverchannel注册到selector

 

  ServerBootstrap在绑定端口(bootstrap.bind(8080))时,调用AbstractBootstrapinitAndRegister方法:

final ChannelFuture initAndRegister() {
        final Channel channel = channelFactory().newChannel();//(1)
        try {
            init(channel);//(2)
        } catch (Throwable t) {
            channel.unsafe().closeForcibly();
            return channel.newFailedFuture(t);
        }

        ChannelPromise regPromise = channel.newPromise();//(3)
        group().register(channel, regPromise);//(4)
        if (regPromise.cause() != null) {
            if (channel.isRegistered()) {
                channel.close();
            } else {
                channel.unsafe().closeForcibly();
            }
        }

        return regPromise;
    }

      1、调用ChannelFactory对象生成ServerBootstrap channel(Class<? extends C> channelClass)方法中设置的channelClass对象即NioServerSocketChannel对象,也就是Netty重新封装过的ServerSocketChannel对象,至于Netty为什么要封装ServerSocketChannel后面章节再写。

      2、 初化NioServerSocketChannel对象,将我们在创建ServerBootstrap对象中设置的option attr值设置到NioServerSocketChannel对象中的configarrs属性中。

      3、生成ChannelPromise对象,这个对象主要是对channel的注册状态进行监听

      4、 eventLoop设置到channel中,并调用AbstractChannel$AbstractUnsaferegister0方法奖channel注册到eventLoop中的selector,并将ChannelPromise状态设置为成功:

private void register0(ChannelPromise promise) {
            try {
                // check if the channel is still open as it could be closed in the mean time when the register
                // call was outside of the eventLoop
                if (!ensureOpen(promise)) {
                    return;
                }
                doRegister();     //将serverchannel注册到selector中
                registered = true;
                promise.setSuccess();
                pipeline.fireChannelRegistered();
                if (isActive()) {
                    pipeline.fireChannelActive();
                }
            } catch (Throwable t) {
                // Close the channel directly to avoid FD leak.
                closeForcibly();
                closeFuture.setClosed();
                if (!promise.tryFailure(t)) {
                    logger.warn(
                            "Tried to fail the registration promise, but it is complete already. " +
                                    "Swallowing the cause of the registration failure:", t);
                }
            }
       }

 

三、绑定端口

  通过initAndRegister方法serverchannel注册到selector后调用doBind0方法注册端口

private static void doBind0(
            final ChannelFuture regFuture, final Channel channel,
            final SocketAddress localAddress, final ChannelPromise promise) {

        // This method is invoked before channelRegistered() is triggered.  Give user handlers a chance to set up
        // the pipeline in its channelRegistered() implementation.

        channel.eventLoop().execute(new Runnable() { //(1)
            @Override
            public void run() {
                if (regFuture.isSuccess()) {
                    channel.bind(localAddress, promise).addListener(ChannelFutureListener.CLOSE_ON_FAILURE);
                } else {
                    promise.setFailure(regFuture.cause());
                }
            }
        });
}

 

 

 

 

 

 

分享到:
评论

相关推荐

    netty源码深入分析

    《Netty源码深入分析》是由美团基础架构部的闪电侠老师所分享的一系列关于Netty源码解析的视频教程。以下将根据标题、描述、标签以及部分内容等信息,对Netty及其源码进行深入剖析。 ### Netty简介 Netty是基于...

    netty源码解析视频

    - `EventLoop`通过注册`Channel`到对应的`Selector`上,监控感兴趣的事件。 - 当事件发生时,`EventLoop`会调用相应的处理器进行处理。 4. **线程模型**: - Netty采用了多线程模型来处理网络I/O操作。 - 主要...

    Netty5.0架构剖析和源码解读

    通过`register`方法将`NioServerSocketChannel`注册到`EventLoop`中,随后调用`bind`方法将Channel绑定到指定地址。 ###### 3.1.3. 新的客户端接入 当有新的客户端接入时,Netty会为每个客户端创建一个新的`...

    Netty源码解析(三)bind方法(二)

    流程走到了启动好reactor线程后,ServerSocketChannel注册到selector上,但是感兴趣事件填的0,我们继续跟流程,走到这里,initAndRegister方法完成,继续跟bind方法,我们看bind方法中的doBind0方法 /** * * @...

    Netty面试专题及答案

    4. 将ServerSocketChannel注册到Selector,指定关注的事件(如接受连接)。 5. 轮询Selector,获取就绪的事件,处理连接请求。 理解Netty的关键在于掌握其对BIO、NIO的改进以及Reactor模式的应用。在面试中,应深入...

    Netty面试专题1

    5. `register(Selector, SelectionKey.OP_ACCEPT)`:将ServerSocketChannel注册到Selector,并关注接受连接事件。 6. 循环调用`Selector.select()`,处理接收到的事件。 以上就是Netty面试专题1中的核心知识点,...

    Netty5.0架构剖析和源码解读.PDF

    在深入探讨Netty 5.0的架构和源码之前,我们需要先理解NIO(非阻塞I/O)的概念。NIO与传统的阻塞I/O模型不同,它允许多个操作在单个线程上并发进行,提高了系统资源利用率,尤其适用于高并发、低延迟的网络应用。 ...

    Netty源码解析-服务启动过程.pdf

    Netty的服务启动过程涉及到多个核心组件和步骤,下面我们通过一个简单的Netty服务器启动代码示例来进行详细的源码解析。 ##### 1. **初始化线程池** 首先,我们需要初始化两个线程池:`bossGroup` 和 `workerGroup...

    Netty面试专题.pdf

    - 将ServerSocketChannel注册到Selector,并关注感兴趣的事件,如ACCEPT事件。 - 使用Selector进行轮询,获取并处理已准备好的事件。 5. **Netty的优化策略**: - **ByteBuf**:Netty的自定义缓冲区,提供了更细...

    JAVA_Netty面试专题10道.pdf

    - 注册Channel:`register()`方法将ServerSocketChannel注册到Selector,并监听接受连接的事件。 6. **NIO的性能问题**: - 当Selector中注册的Channel数量庞大时,维护fdToKey映射可能会成为性能瓶颈,需要合理...

    Netty面试专题及答案.pdf

    - 将ServerSocketChannel注册到Selector,关注Accept事件。 - 调用Selector的select方法,轮询获取已就绪的事件,处理连接请求。 5. **Netty性能优化**: - 使用DirectByteBuffer减少系统空间到用户空间的拷贝,...

    Netty5 AIO

    **Netty5 AIO 深度解析** ...同时,Netty的源码也是一个很好的学习资源,它展示了如何高效地设计和实现网络框架。对于想要深入理解网络编程和Java并发的开发者来说,Netty5 AIO是不可或缺的知识点。

    netty学习之ServerChannel

    7. **多路复用技术**:Netty利用Java NIO的Selector机制,通过一个工作线程就可以同时处理多个连接,极大地提高了服务器的并发性能。 8. **事件模型**:Netty采用了一种称为“ reactor”模式的事件驱动架构。它将I/...

    架构师面试题系列之Netty面试专题及答案(10题).docx

    - 将 ServerSocketChannel 注册到 Selector,并关注感兴趣的事件(如连接事件)。 - 轮询 select() 方法,处理就绪的事件。 这些知识点只是 Netty 面试中的冰山一角,深入理解 Netty 的设计原则、线程模型、编码...

    详细介绍 NIO与Netty编程-实战讲义详细pdf.7z

    4. **心跳检测与故障恢复**:保持连接健康,当检测到服务异常时自动切换到备用节点。 ### 五、Netty介绍 **Netty**是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。...

    Netty使用与实现.pdf

    ### Netty的使用与实现详解 #### 一、Netty简介 Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器与客户端。它简化了网络程序的开发过程,提供了丰富的特性支持,使得...

Global site tag (gtag.js) - Google Analytics