目录

服务端

  1. 初始化NioServerSocketChannel
  2. 初始化NioServerSocketChannel.pipeline。在pipeline中初始化一个 ChannelInitializer任务:任务内容
    1. 当NioServerSocketChannel注册完成时,为pipeline添加handler(注意不是childHandler)
    2. 当NioServerSocketChannel注册完成时,为pipeline添加ServerBootstrapAcceptor (用于处理接受用户连接)
    3. 当NioServerSocketChannel注册完成后,从pipeline上删除ChannelInitializer任务本身。
  3. 将NioServerSocketChannel 注册到boss中一个NioEventLoop上,生成NioServerSocketChannel.selectionKey
  4. 绑定ip和端口
  5. 设置NioServerSocketChannel.selectionKey 的interestOps = 16 (只关注Accept请求)
    1. 相关代码:pipeline.fireChannelActive()
  6. ==
  7. 客户端连接过来
  8. ==
  9. 上面ServerBootstrapAcceptor这个handler来处理用户的连接操作
  10. 初始化NioSocketChannel
  11. 初始化NioSocketChannel.pipeline。增加用户自定义的childHandler
  12. 将NioSocketChannel注册到到work中一个NioEventLoop上
  13. 置NioSocketChannel.selectionKey 的interestOps = 1 (只关Read请求)
    1. 相关代码:pipeline.fireChannelActive()

客户端

  1. 初始化NioSocketChannel
  2. 初始化NioSocketChannel.pipeline。增加用户自定义的childHandler
  3. 将NioSocketChannel注册到到work中一个NioEventLoop上
  4. 连接到远程服务端的ip和端口,等待服务端接收连接
  5. 客户端设置interestOps = SelectionKey.CONNECT ,开始监听服务端接受连接的消息
  6. 服务端接受连接,客户端收到SelectionKey.CONNECT消息
  7. 客户端设置interestOps = SelectionKey.OP_READ, 开始监听服务端发来的数据

额外的细节

             .childHandler(new ChannelInitializer<SocketChannel>() {
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
                     ChannelPipeline p = ch.pipeline();
                     if (sslCtx != null) {
                         p.addLast(sslCtx.newHandler(ch.alloc()));
                     }
                     //p.addLast(new LoggingHandler(LogLevel.INFO));
                     p.addLast(new EchoServerHandler());
                     p.addLast(new EventExecutorGroup(),new EchoServerHandler()); // 可以为某个handler设置线程池
                 }
             });