Netty——5、源码分析
1、启动剖析
我们来看看 netty 中对下面的代码是怎样处理的。
public class Test {
public static void main(String[] args) throws IOException {
//1 netty 中使用 NioEventLoop (简称 nio boss 线程) 来封装线程和 selector
Selector selector = Selector.open();
// 2 创建 NioServerSocketChannel,同时会初始化它关联的 handler,以及为原生 ssc 存储 config
NioServerSocketChannel attachment = new NioServerSocketChannel();
// 3 创建 NioServerSocketChannel 时,创建了 java 原生的 ServerSocketChannel
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
// 4 启动 nio boss 线程执行接下来的操作
// 5 注册(仅关联 selector 和 NioServerSocketChannel),未关注事件
SelectionKey selectionKey = serverSocketChannel.register(selector, 0, attachment);
// 6 head -> 初始化器 -> ServerBootstrapAcceptor -> tail,初始化器是一次性的,只为添加 acceptor
// 7 绑定端口
serverSocketChannel.bind(new InetSocketAddress(8080));
}
}
2、EventLoop
3、accept 流程
- selector.select() 阻塞直到事件发生;
- 遍历处理 selectedKeys;
- 拿到一个 key,判断事件类型是否为 accept;
- 创建 SocketChannel 注册至 Selector;
- 关注 selectionKey 的 read 事件。
4、read 流程
- selector.select() 阻塞直到事件发生;
- 遍历处理 selectedKeys;
- 拿到一个 key,判断事件类型是否为 read;
- 读取操作。