AbstrcatChannel 继承 DefaultAttributeMap 类,并且实现 Channel 接口。
AbstractChannel 的成员变量大体如下:
FLUSH0_CLOSED_CHANNEL_EXCEPTION
、ENSURE_OPEN_CLOSED_CHANNEL_EXCEPTION
、CLOSE_CLOSED_CHANNEL_EXCEPTION
、WRITE_CLOSED_CHANNEL_EXCEPTION
这四个常量来表示。FLUSH0_NOT_YET_CONNECTED_EXCEPTION
来接收。…
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 方法获取,它是一个抽象方法,具体由对应的子类来实现。它的方法如下:
AbstrcatChannel 是实现 Channel 的抽象接口,它聚合了所有 Channel 使用到的能力对象,里面没有具体实现太多的功能。为子类提供了很好的代码模版,各个继承类具体实现里面的方法。