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

相關文章
相關標籤/搜索