一 Netty服务端NioEventLoop的启动

Netty服务端创建、初始化完成后,再向Selector上注册时,会将服务端Channel与NioEventLoop绑定,绑定之后,一方面会将服务端Channel的注册工作当做Runnable任务提交到NioEventLoop的taskQueue,另一方面,会开始NioEventLoop的启动工作。从服务端Channel注册Selector代码的入口一直跟踪,到如下代码时,开始进行以上所说的操作。
以上代码中eventLoop.inEventLoop()方法会判断当前线程是不是在NioEventLoop中运行,初次运行在此,NioEventLoop中的thread变量还没有被赋值,所以返回false,执行eventLoop.execute方法,如下代码所示,其中addTask方法将服务端Channel的注册工作当做Runnable任务加入到taskQueue队列。同样,inEventLoop变量为false,后面便开始执行启动NioEventLoop的代码startThread方法。
 
 
代码运行在这里后,NioEventLoop就启动完毕,开始执行其run方法,在它的run方法中,NioEventLoop会做如下三件事:
①轮询Channel中准备就绪的IO事件
②处理准备就绪的IO事件
③处理在任务队列中的非IO任务,包括定时任务
下面主要分析一下服务端对新连接接入的处理。

二 Netty服务端接入新连接处理

从上图所示的processSelectedKeys()方法进入往后跟一下,会到处理每一个key的processSelectedKey()方法,进入该方法后首先会判断key的有效性,然后便根据key所关联的Channel已经准备好的事件进行分类处理,下图红框中的代码就是服务端处理新连接接入的代码,unsafe.read()方法会进入NioMessageUnsafe类的read方法,其中NioMessageUnsafe类是AbstractNioMessageChannel类的内部类。
 
由以上代码可知,服务端处理新连接接入时先accept新连接,doReadMessages中只做了很简单的操作,如下代码所示,首先accept返回一个Java Nio底层SocketChannel,然后封装为Netty的NioSocketChannel放入List中,NioSocketChannel在创建过程中,也和创建服务端Channel类似会为客户端Channel创建一系列Netty核心组件,比如Pipeline、unsafe等。
接下来就是就是真正的处理新接入的服务端Channel了,有一点先要明确,此时服务端Channel的pipeline为:
head → ServerBootstrapAcceptor → tail,当执行pipeline.fireChannelRead(NioSocketChannel)方法时,事件沿着pipeline上的handler进行传播,到ServerBootstrapAcceptor 的channelRead方法中开始处理新接入的客户端Channel。在分析对客户端Channel的处理之前,先看看在用户代码中配置ServerBootstrap的一个简单示例:
 
ServerBootstrapAcceptor 的channelRead方法:
在channelRead方法中,首先将上游handler传来的msg强转为Channel,然后配置客户端Channel的pipeline,在pipeline中添加的childHandler就是在用户代码中配置ServerBootstrap时childerHander方法中传入的ChannelInitializer这个handler,在后面会由ChannelInitializer的initChannel方法构造出真正处理数据的客户端Channel的pipeline。此时,客户端Channel的pipeline为:head → ChannelInitializer → tail。设置完客户端Channel的option与attr后,将会进行客户端Channel的注册工作,这一流程和注册服务端Channel基本一致,区别是服务端Channel注册过程中是与boosGroup中的线程绑定,而客户端Channel是与workGroup中的线程绑定。childGroup.register方法的childGroup就是用户配置ServerBootstrap是传入的workGroup。
childGroup.register方法跟进去后如上所示,next()会返回workGroup中的一个线程,后面的注册过程就和服务端Channel的注册一模一样了。
 
至此,Netty服务端接收了一个客户端连接,还为客户端Channel绑定了一个workGroup中的线程,并且完成了客户端Channel的注册及启动客户端Channel所绑定NioEventLoop。

Netty服务端NioEventLoop启动及新连接接入处理的更多相关文章

  1. Netty服务端的启动源码分析

    ServerBootstrap的构造: public class ServerBootstrap extends AbstractBootstrap<ServerBootstrap, Serve ...

  2. Netty 学习(八):新连接接入源码说明

    Netty 学习(八):新连接接入源码说明 作者: Grey 原文地址: 博客园:Netty 学习(八):新连接接入源码说明 CSDN:Netty 学习(八):新连接接入源码说明 新连接的接入分为3个 ...

  3. netty服务端客户端启动流程分析

    服务端启动流程 我们回顾前面讲解的netty启动流程,服务端这边有两个EventLoopGroup,一个专门用来处理连接,一个用来处理后续的io事件 服务端启动还是跟nio一样,绑定端口进行监听,我们 ...

  4. Netty是如何处理新连接接入事件的?

    更多技术分享可关注我 前言 前面的分析从Netty服务端启动过程入手,一路走到了Netty的心脏——NioEventLoop,又总结了Netty的异步API和设计原理,现在回到Netty服务端本身,看 ...

  5. Netty 服务端创建

    参考:http://blog.csdn.net/suifeng3051/article/details/28861883?utm_source=tuicool&utm_medium=refer ...

  6. ZooKeeper单机服务端的启动源码阅读

    程序的入口QuorumPeerMain public static void main(String[] args) { // QuorumPeerMain main = new QuorumPeer ...

  7. Netty 服务端启动过程

    在 Netty 中创建 1 个 NioServerSocketChannel 在指定的端口监听客户端连接,这个过程主要有以下  个步骤: 创建 NioServerSocketChannel 初始化并注 ...

  8. netty服务端启动--ServerBootstrap源码解析

    netty服务端启动--ServerBootstrap源码解析 前面的第一篇文章中,我以spark中的netty客户端的创建为切入点,分析了netty的客户端引导类Bootstrap的参数设置以及启动 ...

  9. Netty之旅三:Netty服务端启动源码分析,一梭子带走!

    Netty服务端启动流程源码分析 前记 哈喽,自从上篇<Netty之旅二:口口相传的高性能Netty到底是什么?>后,迟迟两周才开启今天的Netty源码系列.源码分析的第一篇文章,下一篇我 ...

随机推荐

  1. Python之HTTP协议

    HTTP协议,又称超文本传输协议,主要用于浏览器与服务器之间的通信. HTTP 协议的制作者是蒂姆·伯纳斯-李,1991年设计出来的,HTTP 协议设计之前目的是传输网页数据的,现在允许传输任意类型的 ...

  2. js-编程练习题-输出年月日以及练习字符串分割,检索,转换整数(int)

    这是在慕课网上看到的编程题-如有侵权,请联系本人删除. 当然:题是他们的,做题是我的...嘿嘿嘿 某班的成绩出来了,现在老师要把班级的成绩打印出来. 效果图: XXXX年XX月X日 星期X--班级总分 ...

  3. 【集合系列】- 深入浅出的分析 Properties

    一.摘要 在集合系列的第一章,咱们了解到,Map 的实现类有 HashMap.LinkedHashMap.TreeMap.IdentityHashMap.WeakHashMap.Hashtable.P ...

  4. 十一、springboot 配置log4j2以及打包成zip文件

    前言 其实我们前面已经配置了日志,但是最近总感觉日志日志格式看的不舒服,并且每次打包都是一个jar 文件,lib都包含在jar 中,每次做很小的修改都需要重新替换jar文件,jar文件会比较大,传输起 ...

  5. 1.flask基础

    1.flask和django的区别? flask,是一个轻量级的框架,内置了:路由/视图/模板(jinja2)/cookie/session/中间件. 可扩展强,第三方组件非常多,例如:wtforms ...

  6. KubeSphere 日志备份与恢复实践

    为什么需要日志备份 KubeSphere 日志系统使用 Fluent Bit + ElasticSearch 的日志采集存储方案,并通过 Curator 实现对 Index 的生命周期管理,定期清理久 ...

  7. CSS_跳动的心

    详细教程CSS3 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  8. CodeForces-Round524 A~D

    A. Petya and Origami time limit per test  1 second   memory limit per test  256 megabytes input stan ...

  9. Spring-security-oAuth2分享

    Spring-security-oAuth2分享 oAuth2简介 OAuth 2.0是用于授权的行业标准协议.OAuth 2.0致力于简化客户端开发人员的工作,同时为Web应用程序,桌面应用程序,移 ...

  10. css修改overflow滚动条默认样式

    html代码 <div class="inner"> <div class="innerbox"> <p style=" ...