前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Netty客户端发起连接过程注意点

Netty客户端发起连接过程注意点

作者头像
书唐瑞
发布2022-06-02 14:14:48
5380
发布2022-06-02 14:14:48
举报
文章被收录于专栏:Netty历险记

使用Netty创建客户端的时候, 和创建服务端类似, 也需要经过创建-初始化-注册这三步, 最后一步也最重要就是连接操作

代码语言:javascript
复制
io.netty.bootstrap.Bootstrap#connect(java.net.SocketAddress)

创建就是创建NioSocketChannel, 同时也会创建unsafe,pipeline,config等. 还会设置一个感兴趣的SelectionKey.OP_READ 读事件属性, 此时也仅仅是把OP_READ保存到一个属性上. 初始化就是给channel设置一些option和attribute. 注册就是将channel注册到对应的NioEventLoop的selector上. 这个连接操作会调用到JDK的channel.connect方法, 然而连接操作实际就是向服务端发启TCP三次握手, 握手是有网络延时的, 而Netty是非阻塞的网络框架. Netty调用connect方法, 发起连接之后就返回了, 但是它会向channel中注册一个感兴趣的连接事件.

源码位置

代码语言:javascript
复制
io.netty.channel.socket.nio.NioSocketChannel#doConnect

等到三次握手完成之后, Netty客户端就会监听到连接事件. (Netty底层会有一个IO线程, 一直轮询着外部的事件

源码位置

代码语言:javascript
复制
io.netty.channel.nio.NioEventLoop#processSelectedKey(java.nio.channels.SelectionKey, io.netty.channel.nio.AbstractNioChannel)
代码语言:javascript
复制
io.netty.channel.DefaultChannelPipeline.HeadContext#channelActive

io.netty.channel.DefaultChannelPipeline.HeadContext#readIfIsAutoRead

io.netty.channel.DefaultChannelPipeline.HeadContext#read

io.netty.channel.nio.AbstractNioChannel#doBeginRead

protected void doBeginRead() throws Exception {
  final SelectionKey selectionKey = this.selectionKey;
  if (!selectionKey.isValid()) {
    return;
  }

  readPending = true;

  final int interestOps = selectionKey.interestOps();
  if ((interestOps & readInterestOp) == 0) {
    // 设置之前保存起来的事件, 例如OP_READ
    selectionKey.interestOps(interestOps | readInterestOp);
  }
}

再经过以上四个主要方法, 最后就会设置感兴趣的OP_READ事件了. 这样客户端才可以读取数据.

【总结】

客户端在向服务器发起连接请求的时候, 由于网络等原因, 连接不会马上成功, Netty是非阻塞框架. 因此在发起连接之后就返回了, 同时设置一个感兴趣的OPCONNECT事件, 等三次握手成功之后, Netty监听到OPCONNECT事件, 然后才会把设置之前的OP_READ事件, 这个时候客户端才可以读取网络数据.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Netty历险记 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档