Netty 新连接的接入

本文通过源码分析Netty是如何一步步的将接收客户端的新连接,然后将连跟NioEventLoop绑定,并注册相应的Read事件。

检测新连接

  • 入口为NioEventLoop的processSelectedKey方法

新连接接入的入口

  • 进入到NioMessageUnsafe的read方法

NioMessageUnsafe的read方法

  • doReadMessages里会接收连接,封装成netty里的NioSocketChannel对象

NioServerSocketChannel类里的doReadMessages

创建NioSocketChannel

Netty通过new 关键字直接创建NioSocketChannel。主要做了如下几步:

  • 调用AbstractNioByteChannel,传入通过accept接收的底层channel。

AbstractNioByteChannel构造方法

  • 通过AbstractNioChannel设置channel的blocking属性为false。

AbstractNioChannel构造方法

  • 继续调用父类,构造channel的id, unsafe与pipeline对象。

AbstractChannel构造方法

  • 构造NioSocketChannelConfig对象,并通过config对象设置tcpNoDelay为true来禁止Nagle算法

NioSocketChannelConfig构造方法

Nagle算法设置为false

分配线程及注册selector

在接收完连接,并封装成NioSocketChannel后,在NioMessageUnsafe的read方法里,通过pipeline触发channelRead事件。

注册事件的入口

之后会在ServerBootstrapAcceptor(这个handler会在服务器bind的方法里添加到NioServerSocketChannel里)这个handler里完成如下步骤

  • 添加childHandler并设置options和attrs

ServerBootstrapAcceptor的channelRead方法

  • 通过chooser选择完NioEventLoop后最终会调用到channel的unsafe的register方法,完成注册操作

SingleThreadEventLoop的register方法

  • 绑定nioEventLoop对象,并调用register0方法

AbstractUnsafe人register方法

  • 调用doRegister完成具体的注册

调用doRegister完成具体的注册

  • 将channel注册到selector上

AbstractNioChannel类的doRegister方法

向selector注册读事件

将NioSocketChannel绑定到selector后,需要注册相应的I/O事件,这样channel就能通过事件响应业务请求了,chennel注册读事件的流程比较长,最终会调用到AbstractUnsafe类的beginRead方法里:

AbstractUnsafe的beginRead方法

  • 最终会调用到AbstractNioChannel的doBeginRead方法里

AbstractNioChannel的doBeginRead方法

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏地方网络工作室的专栏

Shell 命令行统计 apache 网站日志访问IP以及IP归属地

Shell 命令行统计 apache 网站日志访问IP以及IP归属地 我的一个站点用 apache 服务跑着,积攒了很多的日志。我想用 shell 看看有哪些人...

2386
来自专栏IT技术精选文摘

RMI原理及实现

1 简介 RMI是远程方法调用的简称,像其名称暗示的那样,它能够帮助我们查找并执行远程对象的方法。通俗地说,远程调用就象将一个class放在A机器上,然后在B机...

1938
来自专栏Java 源码分析

MyBatis笔记二:配置

可以看到我们使用 <properties resource="db.properties"/> 引入了我们的数据据库的配置文件,然后这个标签有两个属性 : r...

1782
来自专栏JAVA烂猪皮

JAVA多线程与并发学习总结

使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行;当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存...

731
来自专栏吴伟祥

spring为何要注入接口,而注入接口的实现类就会报错

  首先说明,注入的对象确实为实现类的对象。(并不是实现类的代理对象,注入并不涉及代理)

1671
来自专栏程序员同行者

django rest framework mixins小结

由上图可以看出这个类的一个逻辑,其中,perform_create( )对serializer直接进行save保存,当在一些情境下,我们需要对perform...

1413
来自专栏开发与安全

linux系统编程之文件与I/O(三):目录的操作

一、目录的访问 功能说明:打开一个目录 原型:DIR*  opendir(char *pathname); 返回值: 打开成功,返回一个目录指针 打开...

1665
来自专栏北京马哥教育

Linux 中命令链接操作符,让你的代码更简洁!

Linux命令中链接的意思是,通过操作符的行为将几个命令组合执行。Linux中的链接命令,有些像你在shell中写短小的shell脚本,并直接在终端中执行。链接...

772
来自专栏Java成神之路

Java之 将程序打包成jar包

   2.指定目录:建一个目录,来存放.class文件和.jar文件。 本文指定目录为 E:\myclass 。

1963
来自专栏linux系统运维

压缩打包的介绍以及几种压缩工具的使用

2016

扫码关注云+社区

领取腾讯云代金券