Netty 源码 Channel(一)概述

Netty 源码 Channel(一)概述

Netty 系列目录(http://www.javashuo.com/article/p-hskusway-em.html)html

Channel 为 Netty 网络操做抽象类,EventLoop 主要是为 Channel 处理 I/O 操做,二者配合参与 I/O 操做。java

Unsafe 是个内部接口,聚合在 Channel 中协助进行网络读写相关的操做。git

1、Channel 功能

Channel 的功能主要功能以下:github

  1. 网络 IO 功能:如 read、write、connect、bind、config、isActive、isOpen 等
  2. 其它:如 eventLoop(绑定的线程)、metadata(获取 TCP 配置参数)、parent(SocketChannel 的 parent 是 ServerSocketChannel)、id(惟一标识符)

2、Channel 建立

以 NioServerSocketChannel 建立过程为例。网络

Channel建立

// 建立 NIO 底层的 ServerSocketChannel 对象
public NioServerSocketChannel() {
    this(newSocket(DEFAULT_SELECTOR_PROVIDER));
}
// NioServerSocketChannel 须要注册 OP_ACCEPT 事件
public NioServerSocketChannel(ServerSocketChannel channel) {
    super(null, channel, SelectionKey.OP_ACCEPT);
    config = new NioServerSocketChannelConfig(this, javaChannel().socket());
}

// 设置成非阻塞模式,并注册感兴趣的事件
protected AbstractNioChannel(Channel parent, SelectableChannel ch, int readInterestOp) {
    super(parent);
    this.ch = ch;
    this.readInterestOp = readInterestOp;
    ch.configureBlocking(false);
}

// 建立 channel 是建立对应的 pipeline
protected AbstractChannel(Channel parent) {
    this.parent = parent;
    id = newId();
    unsafe = newUnsafe();
    pipeline = newChannelPipeline();
}

NioServerSocketChannel 建立过程主要干了两件事,其配置信息保存在 NioServerSocketChannelConfig 中:socket

  1. 建立 JDK 底层的 ServerSocketChannel 对象
  2. 建立 ChannelPipeline

ServerSocketChannel 建立为何要用 provider.openServerSocketChannel()?ide

private static ServerSocketChannel newSocket(SelectorProvider provider) {
    // ServerSocketChannel.open() 每秒建立 5000 个链接时性能会下将 1%
    // https://github.com/netty/netty/issues/2308
    return provider.openServerSocketChannel();
}

天天用心记录一点点。内容也许不重要,但习惯很重要!oop

相关文章
相关标签/搜索