1. 我们常说的SocketChannel具体是哪个类

SocketChannel 实际上有两个

  • java.nio.channels.SocketChannel
  • io.netty.channel.socket.SocketChannel

2. 两个SocketChannel的关系

NioSocketChannel 的构造函数就可以看出来,

  • NioSocketChannel实现了Netty的SocketChannel

image.png

  • NioSocketChannel包装了JDK的 SocketChannel
  • 我们在开发Netty应用的时候是操作Netty提供的SocketChannel, JDK提供的是被屏蔽掉的

image.png

同样的 OioSocketChannel EpollSocketChannel 也是一样

3. 为什么Netty要搞一个SocketChannel

通过查看源码可知, 真正操作网络连接和数据的实际上是 java.nio.channels.SocketChannel 这个是JDK提供的

但是JDK提供的这个 java.nio.channels.SocketChannel 操作起来太麻烦了, JDK提供的其他IO操作API使用起来也很麻烦, 比如 ByteBuffer, SelectionKey等, 具体使用方式参见: https://www.yuque.com/zhouyijin/ydt8po/stp1g3

于是Netty自己搞了一套操作socket和数据的编程模式,
我们在Netty语境下, 一般操作使用的是 io.netty.channel.socket.SocketChannel

4. Netty的SocketChannel在哪被使用

举两个例子
Netty应用一定会写的initChannel方法
image.png
image.png

5. Netty的SocketChannel提供了哪些操作

我们来一层一层网上扒, 看接口的继承结构

5.1 SocketChannel

表示一个TCP/IP的通信管道
image.png

5.2 DuplexChannel

双向的通信管道, 双向的状态判断和关闭操作
image.png

5.3 Channel

提供对管道的一些操作
image.png
比较重要的有获取绑定在这个管道上的 ChannelPipeline , 我们在开发Netty应用的时候一定会用到的方法
io.netty.channel.Channel#pipeline

还有register 管道注册到EventLoop之后就会开始读取数据了
io.netty.channel.AbstractChannel.AbstractUnsafe#register

5.3.1 Channel 接口里面的 Unsafe

  • 非常重要的一个方法 io.netty.channel.Channel.Unsafe#beginRead : 触发开始读操作的接口

image.png

5.4 ChannelOutboundInvoker

管道出站, 也就是写操作 的抽象
由于读操作是由EventLoop触发的, 所以不提供主动的读操作接口, 所以这里只有写操作接口
image.png

知道为啥golang要干掉继承了吧, 这尼玛乱七八糟的一堆继承, 谁他妈知道里面什么鬼