Netty从入门到放弃,从放弃在到入门
服务端Channel初始化过程
1. 通过 BootstrapChannelFactory 实例化 NioServerSocketChannel(实例化 Channel 的具体类型又是和在初始化 ServerBootstrap 时传入的 channel() 方法的参数相关)
a. 调用 NioServerSocketChannel.newSocket(DEFAULT_SELECTOR_PROVIDER) 打开一个新的 Java NIO ServerSocketChannel
b. 在 AbstractChannel(Channel parent) 中初始化 AbstractChannel 的属性:
parent 属性置为 null
unsafe 通过newUnsafe() 实例化一个 unsafe 对象
pipeline 是 new DefaultChannelPipeline(this) 新创建的实例
c. AbstractNioChannel 中的属性:
SelectableChannel ch 被设置为 Java ServerSocketChannel, 即 NioServerSocketChannel#newSocket 返回的 Java NIO ServerSocketChannel.
readInterestOp 被设置为 SelectionKey.OP_ACCEPT
SelectableChannel ch 被配置为非阻塞的 ch.configureBlocking(false)
d. NioServerSocketChannel 中的属性:
ServerSocketChannelConfig config = new NioServerSocketChannelConfig(this, javaChannel().socket())
2. NioServerSocketChannel 和 BossGroup 中 eventLoop 的 Selector 关联, 并将 Handler 添加到 NioServerSocketChannel 的 PipeLine中
a. 将 Handler 和 ServerBootstrapAcceptor 添加到 NioServerSocketChannel 的 PipeLine 中。
b. initAndRegister() 中的 ChannelFuture regFuture = group().register(channel); 这里的 register() 是指将 NioServerSocketChannel 和 BossGroup 关联。
3. NioSocketChannel 和 WorkGroup 中 eventLoop 的 Selector 关联
initAndRegister() 中的 init() 方法中会 new ServerBootstrapAcceptor()
a. 当有新的客户端连接请求时, ServerBootstrapAcceptor.channelRead 负责新建此连接的 NioSocketChannel。
b. ServerBootstrapAcceptor 的 channelRead() 方法会添加 childHandler 到 NioSocketChannel 对应的 pipeline 中。
c. 将此 NioSocketChannel 绑定到 workerGroup 中的某个 eventLoop 中。