前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Netty 新连接的接入

Netty 新连接的接入

作者头像
良辰美景TT
发布2018-12-19 16:25:23
6970
发布2018-12-19 16:25:23
举报
文章被收录于专栏:java、Spring、技术分享

本文通过源码分析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方法

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.11.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 检测新连接
  • 创建NioSocketChannel
  • 分配线程及注册selector
  • 向selector注册读事件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档