bootstrap.connect的调用链路
对于一个 Netty client 来说,在配置好 Bootstrap
之后,通过调用其 connect
方法来连接到远程服务端,如下所示
1 | Bootstrap b = new Bootstrap(); |
要完成上述功能,connect
内部需要执行一系列操作
initAndRegister
通过 channelFactory 创建一个 channel 实例。假如 BootStrap 配置 channel 类型为 NioSocketChannel.class
,那么就创建一个 NioSocketChannel
类型的实例
1 | b.group(group) |
init
的实现比较简单,就是对 channel
和 pipeline
进行一些配置
如上图所示,主要进行了这些配置:
- 往 pipeline 上添加用户自定义的 handler
- 设置 channel 的选项 option
- 设置 channel 的属性 attributes
register 的逻辑与 ServerBootStrap 类似,见 注册channel到EventLoop
doResolveAndConnect0
remoteAddress
可能是一个无法解析的地址,所以会先尝试通过 AddressResolver
进行解析。AddressResolver
与 EventLoop
进行关联,通过 map 进行缓存
doConnect
这才到了真正的连接操作
channel.connect -> pipeline.connect -> tail.connect -> ... -> head.connect -> unsafe.connect
unsafe 是一个平台相关的实现类,它依赖于具体的底层实现,例如对于 NioSocketChannel
来说,它的 unsafe 的 connect
方法实现如下图所示
当本地地址不为空时,先要执行 bind
操作,然后再执行 connect
操作
SocketUtils
封装了 jdk 提供的 socket 操作,如下是 connect
和 bind
的实现
- 2021-11-26
今天在解决一个问题时,需要测下某机器的指定端口是否能正常接收数据,忽然发现想不起来命令叫啥(就是nc),看来还是要做好记录。考虑到后续可能还会添加新的命令,还要方便查阅和分享,索性就记到这里吧。
- 2021-02-05
netty 中每个 channel 都会绑定了一个 pipeline,当有入站事件或出站操作时,会由 pipeline 中的 handler 进行拦截处理。
- 2021-01-26
ServerBootstrap 启动时需要初始化 ServerSocketChannel 并将其绑定到 EventLoop 上,用于处理该 channel 上产生的各种事件。那么 ServerSocketChannel 是如何完成创建和初始化的?又是如何绑定到 EventLoop 上的?
- 2021-02-05
netty 是一个基于异步事件驱动实现的网络编程框架,它的内部使用了大量的异步编程方法,这是它性能高效的一个原因,但同时也使得代码阅读起来更加困难,本文就尝试分析下它的启动过程
- 2022-01-30
在上一篇文章中,我们了解了如何通过 netty 实现一个echo server。你应该还记得
ServerBootstrap
启动类,它负责 server 的启动管理,在启动前我们需要为其配置EventLoopGroup
。EventLoopGroup
有配套的ServerSocketChannel
,比如通常使用最多的是NioEventLoopGroup
,它就需要和NioServerSocketChannel
搭配起来工作。