前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手把手教你调试Netty创建连接流程源码

手把手教你调试Netty创建连接流程源码

作者头像
JavaEdge
发布2021-02-22 13:41:00
1620
发布2021-02-22 13:41:00
举报
文章被收录于专栏:JavaEdge

执行过程

boss thread

  • NioEventLoop 中的 selector轮询创建连接事件 (ОР_АССЕРT)
  • 创建 socket channel
  • 初始化 socket channel 并从 worker group 中选择一个 NioEventLoop

worker thread

  • 将socket channel注册到选择的NioEventLoop的selector
  • 注册读事件(OP_ READ)到selector 上

接收连接请求的处理本质是对 OP_ACCEPT 的处理,即在 NioEventLoop 中,因为注册到了NioEventLoop的 selector。 分别调试启动 EchoServer 和 EchoClient

  • 跳至对应 handler
    • 当前为 bosseventloop,不是 workereventloop
  • 所以这里 false,又来到注册
  • 创建完连接后了,已经可以开始接收数据了,即准备读数据了

最后观察下 server 的日志信息

  • 前5行都是服务启动,后面的就是为了创建连接
  • 服务启动过程多了个 bind 过程,且只绑定了一个接口,而对于下面的创建连接过程它有两个端口:客户端端口+server 监听的端口,这就是 socketChannel

接收连接的核心代码

代码语言:javascript
复制
// 阻塞轮询。非阻塞轮询。超时等待轮询
selector.select()/ selectNow()/select(timeoutMillis) 发现 OP_ACCEPT 事件,处理:
SocketChannel socketChannel = serverSocketChannel.accept()
selectionKey = javaChannel().register(eventLoop().unwrappedSelector(), 0, this);
selectionKey.interestOps(OP_READ);

创建连接的初始化和注册是通过pipeline.fireChannelReadServerBootstrapAcceptor中完成

第一次Register并非监听OP_READ,而是0

代码语言:javascript
复制
selectionKey = javaChannel().register(eventLoop().unwrappedSelector(), 0, this)

最终监听OP_READ是通过"Register"完成后的fireChannelActive (io.netty.channel.AbstractChannel.AbstractUnsafe#register0)触发

Worker’s NioEventLoop是通过Register操作执行来启动。

接受连接的读操作,不会尝试读取更多次(16次)。 因为无法知道后续是否还有连接,不可能一直尝试。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 执行过程
    • boss thread
      • worker thread
      • 接收连接的核心代码
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档