1. 我们常说的SocketChannel具体是哪个类
SocketChannel 实际上有两个
java.nio.channels.SocketChannel
io.netty.channel.socket.SocketChannel
2. 两个SocketChannel的关系
从 NioSocketChannel
的构造函数就可以看出来,
- NioSocketChannel实现了Netty的SocketChannel
- NioSocketChannel包装了JDK的 SocketChannel
- 我们在开发Netty应用的时候是操作Netty提供的SocketChannel, JDK提供的是被屏蔽掉的
同样的 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方法
5. Netty的SocketChannel提供了哪些操作
我们来一层一层网上扒, 看接口的继承结构
5.1 SocketChannel
表示一个TCP/IP的通信管道
5.2 DuplexChannel
双向的通信管道, 双向的状态判断和关闭操作
5.3 Channel
提供对管道的一些操作
比较重要的有获取绑定在这个管道上的 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
: 触发开始读操作的接口
5.4 ChannelOutboundInvoker
管道出站, 也就是写操作 的抽象
由于读操作是由EventLoop触发的, 所以不提供主动的读操作接口, 所以这里只有写操作接口
知道为啥golang要干掉继承了吧, 这尼玛乱七八糟的一堆继承, 谁他妈知道里面什么鬼