Netty——5、源码分析

发布时间 2023-06-30 10:25:12作者: 啊噢1231

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;
  • 读取操作。