Netty源码-07-Channel
一 类图关系
在Java的NIO体系中定义了ServerSocketChannel和SocketChannel。Netty为了支持Reactor线程模型和异步编程,自己也实现了与Java中对应的两个实现:
- NioServerSocketChannel。
- NioSocketChannel。
从功能职责来看:
- NioServerSocketChannel负责连接数据。
- NioSocketChannel负责读写数据。
从工作端来看:
- NioServerSocketChannel对接ServerSocket,仅使用在服务端。
- NioSocketChannel对接Socket,可以使用在服务端,也可以使用在客户端。
一般涉及资源开辟都使用懒加载方式,涉及多实现都会通过提供对应Provider或者Factory方式进行创建。
二 ChannelFactory
java
1 |
|
在AbstractBootstrap维护了channelFactory,将来在恰当时机可以通过Factory创建需要的实例。
1 channelFactory(…)
java
1 |
|
java
1 |
|
该方法的作用就是个setter方法,负责channelFactory赋值。
2 new ReflectiveChannelFactory(…)
java
1 |
|
java
1 |
|
ReflectiveChannelFactory这个类也很简单,只提供了一个构造方法,需要指定Channel实现类对象,将来调用channelFactory的newChannel就可以通过类对象的无参构造方法反射创建Channel实例对象。
三 SelectorProvider
关于SelectorProvider的分析,在Java实现Selector中有涉及。
现在我们只需要关心两个方法的实现:
- openServerSocketChannel
- openSocketChannel
不同平台的SelectorProvider如下:
- Linux EPollSelectorProvider
- MacOSX KQueueSelectorProvider
- Windows WindowsSelectorProvider
它们都继承自SelectorProviderImpl。
java
1 |
|
1 openServerSocketChannel()
java
1 |
|
java
1 |
|
2 openSocketChannel()
java
1 |
|
java
1 |
|
3 创建OS的Socket
cpp
1 |
|
cpp
1 |
|
也就是最终通过系统调用socket()创建了Socket对象,Netty根据OS的fd根据调用封装成Java对象ServerSocketChannel和SocketChannel。
四 NioServerSocketChannel无参构造方法
java
1 |
|
java
1 |
|
java
1 |
|
java
1 |
|
五 NioSocketChannel无参构造方法
java
1 |
|
java
1 |
|
java
1 |
|
java
1 |
|
Netty源码-07-Channel
https://bannirui.github.io/2023/03/06/Netty源码-07-Channel/