Netty 新连接的接入

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

检测新连接
  • 入口为NioEventLoop的processSelectedKey方法
    5796101-701107069cf440c3.png
    新连接接入的入口
  • 进入到NioMessageUnsafe的read方法
    5796101-9a05b9b77ab7b55d.png
    NioMessageUnsafe的read方法
  • doReadMessages里会接收连接,封装成netty里的NioSocketChannel对象
    5796101-bf5812c7e0848b0a.png
    NioServerSocketChannel类里的doReadMessages
创建NioSocketChannel

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

  • 调用AbstractNioByteChannel,传入通过accept接收的底层channel。
    5796101-cad3f8737a6d12a1.png
    AbstractNioByteChannel构造方法
  • 通过AbstractNioChannel设置channel的blocking属性为false。
    5796101-5ab405db75774529.png
    AbstractNioChannel构造方法
  • 继续调用父类,构造channel的id, unsafe与pipeline对象。
    5796101-b1327e68dc43b545.png
    AbstractChannel构造方法
  • 构造NioSocketChannelConfig对象,并通过config对象设置tcpNoDelay为true来禁止Nagle算法
    5796101-1e1f8671df358b86.png
    NioSocketChannelConfig构造方法
    5796101-d991ff864a125115.png
    Nagle算法设置为false
分配线程及注册selector

在接收完连接,并封装成NioSocketChannel后,在NioMessageUnsafe的read方法里,通过pipeline触发channelRead事件。
5796101-ab0cfcda9759cff3.png
注册事件的入口

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

  • 添加childHandler并设置options和attrs
    5796101-97646f25e5dd892a.png
    ServerBootstrapAcceptor的channelRead方法
  • 通过chooser选择完NioEventLoop后最终会调用到channel的unsafe的register方法,完成注册操作
    5796101-81203141764bf6d7.png
    SingleThreadEventLoop的register方法
  • 绑定nioEventLoop对象,并调用register0方法
    5796101-6b2912da77545efd.png
    AbstractUnsafe人register方法
  • 调用doRegister完成具体的注册
    5796101-35b3e240335dc8b0.png
    调用doRegister完成具体的注册
  • 将channel注册到selector上
    5796101-631cd43608149b0f.png
    AbstractNioChannel类的doRegister方法
向selector注册读事件

将NioSocketChannel绑定到selector后,需要注册相应的I/O事件,这样channel就能通过事件响应业务请求了,chennel注册读事件的流程比较长,最终会调用到AbstractUnsafe类的beginRead方法里:
5796101-2f526f309a6911fa.png
AbstractUnsafe的beginRead方法
  • 最终会调用到AbstractNioChannel的doBeginRead方法里
    5796101-dbe72a70952d2d47.png
    AbstractNioChannel的doBeginRead方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值