netty源码阅读之客户端新连接之SocketChannel的分类

柔情只为你懂 2022-05-17 13:16 225阅读 0赞

SocketChannel分为两种:

1、NioSocketChannel

2、NioServerSocketChannel

让我们用一个简化的类图来看看他们的关系:

70

最终他们都继承自Channel,这个Channel是netty定义的,Channel定义了子类的规范。

AbstractChannel对Channel做了抽象的实现:

  1. private final Channel parent;
  2. private final ChannelId id;
  3. private final Unsafe unsafe;
  4. private final DefaultChannelPipeline pipeline;

还有重要的EventLoop也是在这个类里面抽象出来的。

这些东西都是在AbstractChannel这里定义的。

接下去是AbstractNioChannel:

  1. /**
  2. * Abstract base class for {@link Channel} implementations which use a Selector based approach.
  3. */
  4. public abstract class AbstractNioChannel extends AbstractChannel {
  5. private static final InternalLogger logger =
  6. InternalLoggerFactory.getInstance(AbstractNioChannel.class);
  7. private static final ClosedChannelException DO_CLOSE_CLOSED_CHANNEL_EXCEPTION = ThrowableUtil.unknownStackTrace(
  8. new ClosedChannelException(), AbstractNioChannel.class, "doClose()");
  9. private final SelectableChannel ch;
  10. protected final int readInterestOp;
  11. volatile SelectionKey selectionKey;
  12. boolean readPending;
  13. ...
  14. }

这个类:Abstract base class for {@link Channel} implementations which use a Selector based approach.,也就是使用了Selector来做为实现读写的监听。

在这里,实现了几个重要的抽象:

  1. private final SelectableChannel ch;
  2. protected final int readInterestOp;
  3. volatile SelectionKey selectionKey;

ch就是jdk底层的channel,readInterestOp感兴趣的事件,selectionKey。

这个类开始,下面就做两个实现,一个是AbstractNioByteChannel,客户端Channel的父类,因为它只关心读(read)事件,组合在里面的unsafe是NioByteUnsafe,他的配置类是NioSocketChannelConfig;另一个是AbstarctNioMessageChannel,服务端Channel的父类,因为是服务端,所以只关心accept事件,组合在里面的unsafe是NioMessageUnsafe,他的配置类是NioServerSocketChannelConfig。后面的config,主要就是处理一些tcp连接的配置。

有兴趣的看源码,也很简单,这里主要简单介绍下而已。

发表评论

表情:
评论列表 (有 0 条评论,225人围观)

还没有评论,来说两句吧...

相关阅读

    相关 netty阅读ByteBuf

    今天我们开启新的篇章,netty很重要的内存概念将在这一章介绍。ByteBuf主要介绍以下几点: 1、内存与内存管理器的抽象 2、不同规格大小和不同类别的内存的分配策略