一 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. 新一代数据安全的制胜法宝-UBA

    [摘要]在入侵防御领域,运用数据分析的方法保护数据的技术其实没有什么新的东西,比如防火墙-分析数据包的内容以及其他的元数据,如IP地址,从增长的数据条目中检测和阻断攻击者:防病毒软件不断的扫描文件系统 ...

  2. 基于webpack实现多html页面开发框架二 css打包、支持scss、文件分离

    本节主要介绍webpack打包的时候CSS的处理方式 一.解决什么问题      1.CSS打包      2.CSS处理浏览器兼容      3.SASS支持      4.CSS分离成单独的文件 ...

  3. springcloud-Eureka组件

    一.简介 Eureka 是 Netflix 开发的服务发现框架,本身是一个基于 REST 的服务,主要用于定位运行在 AWS 域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringC ...

  4. NRF51802蓝牙4.0BLE

    今天给大家介绍一款NRF51802的芯片 它是NRF51822的COSTDOWN精简版 本质上跟NRF51822是一致的,原厂为了给大客户节省成本而定制的一个版本 可以跟NRF51822软件硬件完全兼 ...

  5. 利用Mitmproxy抓包

    http://mrpeak.cn/blog/mitmproxy/   和Charles同样强大的免费抓包软件. 它是在终端操作的,界面没有Charles那么可视化.不过也很好用,通过各种快捷键操作,效 ...

  6. AutoLayout的那些事儿

    转自:http://www.cocoachina.com/ios/20160530/16522.html 本文投稿文章,作者:MangoMade(简书) AutoLayout非常强大也非常易用,可读性 ...

  7. A*算法在最短路问题的应用及其使用举例

    1 A*算法 A*算法在人工智能中是一种典型的启发式搜索算法,启发中的估价是用估价函数表示的: 其中f(n)是节点n的估价函数,g(n)表示实际状态空间中从初始节点到n节点的实际代价,h(n)是从n到 ...

  8. enumerate用法总结

    enumerate在字典上是枚举.列举的意思 对于一个可迭代的(iterable)/可遍历的对象(如列表.字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值 enumerat ...

  9. Mysql双活方案

    #### 说明 Mysql主主互备即为两个mysql的互为备份机   ##### Windows下安装步骤(Linux下步骤类似,基本就是装上mysql,然后修改配置来完成主从的设置) - step1 ...

  10. (重点)Python深入之Python内存管理机制你会吗?

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:醍醐三叶 请注意:如果你平时学Python遇到问题找不到人解答?或者没有 ...