Netty的AbstractChannel源码解析

Netty的AbstractChannel源码解析教程

AbstrcatChannel 继承 DefaultAttributeMap 类,并且实现 Channel 接口。

成员变量

AbstractChannel 的成员变量大体如下:

21 AbstractChannel 的成员变量.png

  1. 针对链路的关闭异常,它定义了 FLUSH0_CLOSED_CHANNEL_EXCEPTIONENSURE_OPEN_CLOSED_CHANNEL_EXCEPTIONCLOSE_CLOSED_CHANNEL_EXCEPTIONWRITE_CLOSED_CHANNEL_EXCEPTION 这四个常量来表示。
  2. 针对物理链路尚未建立的异常,定义了一个 FLUSH0_NOT_YET_CONNECTED_EXCEPTION 来接收。
  3. parent:父类 Channel
  4. id:采用默认的方式生成的全局唯一 ID;
  5. unsafe:Unsafe 实例
  6. pipeline:当前 Channel 对应的 DefaultChannelPipeline 对象
  7. eventLoop:当前 Channel 注册的 EventLoop;

Channel 接口中采用了聚合方式封装了各种功能,所以 AbstractChannel 也是采用了聚合方式。AbstractChannel 聚合了所有 Chanenl 使用到的能力对象,由 AbstractChannel 提供初始化和统一封装。

核心方法分析

Netty 基于事件驱动的,我们可以理解为当 Channel 进行 I/O 操作时会产生对应的 I/O 事件,然后驱动事件在 ChannelPipeline 中传播,由对应的 ChannelHandler 对事件进行拦截和处理,不关心的事件可以直接当忽略。网络 I/O 操作直接调用 DefaultChannelPipeline 的相关方法,由 DefaultChannelPipeline 中对应的 ChannelHandler 进行具体逻辑处理,它的源码如下:

@Override public ChannelFuture bind(SocketAddress localAddress, ChannelPromise promise) { return pipeline.bind(localAddress, promise); } @Override public ChannelFuture connect(SocketAddress remoteAddress, ChannelPromise promise) { return pipeline.connect(remoteAddress, promise); } @Override public ChannelFuture disconnect(ChannelPromise promise) { return pipeline.disconnect(promise); } @Override public ChannelFuture close(ChannelPromise promise) { return pipeline.close(promise); } @Override public ChannelFuture deregister(ChannelPromise promise) { return pipeline.deregister(promise); } @Override public Channel read() { pipeline.read(); return this; }

因为 AbstractChannel 是一个抽象类,它也提供了一些公共的 API 的具体实现,我们以 localAddress 方法为例子:

@Override public SocketAddress localAddress() { SocketAddress localAddress = this.localAddress; if (localAddress == null) { try { this.localAddress = localAddress = unsafe().localAddress(); } catch (Throwable t) { // Sometimes fails on a closed socket in Windows. return null; } } return localAddress; }

将成员变量的 localAddress 赋值给当前的方法变量,如果为空的话就通过 unsafe 的 localAddress 方法获取,它是一个抽象方法,具体由对应的子类来实现。它的方法如下:

22 abstractChannel的localaddress方法.png

Netty的AbstrcatChannel源码总结

AbstrcatChannel 是实现 Channel 的抽象接口,它聚合了所有 Channel 使用到的能力对象,里面没有具体实现太多的功能。为子类提供了很好的代码模版,各个继承类具体实现里面的方法。