在了解 NIO 的 Channel 的时候,我们知道,它是用于非阻塞 I/O 的操作。类似于 NIO 的 Channel,Netty 提供了自己的 Channel 和其子类实现,用于异步 I/O 操作和其他相关的操作。它聚合了一组功能。
它的里面包含了网络的读、写,客户端发起连接,主动关闭链路,获取通信双方的网络地址等等功能。它里面也包含了 Netty 框架里面的一些东西,获取该 Channel 的 EventLoop,获取缓冲分配器 ByteBufAllocator 和 pipeline 等等。
在 JDK 中会有自带的 SocketChannel 和 ServerSocketChannel,它们各自实现自己的功能,对使用者而言没有统一的操作视图,使用比较繁琐和复杂,对 Netty 的框架的整体融合也不是很好,所以 Netty 就自定义了 Channel ,Netty 的主要设计理念如下:
Channel 是一个接口,它里面包含的方法有:
ChannelOutboundInvoker
存在该方法,它将当前的 msg 通过 ChannelPipeline 写入到目标 Channel 中。这边需要关注的是 write 操作只是将消息存入到消息发送环形数组中,没有真正的发送消息,只有调用了 flush 操作才会将数据写入到 Channel 中,发送给对方。ChannelOutboundInvoker
存在该方法,它的功能与 write(Object msg) 相同,只不过携带了 ChannelPromise 参数用来负责接收写入操作的结果。ChannelOutboundInvoker
存在该方法,它的功能和 3 差不多,但是它会将消息写入 Channel 中发送,相当于单独调用了 write 和 flush 操作的组合。ChannelOutboundInvoker
存在该方法。将之前写入到发送环形数组中的消息全部写入到目标 Channel 中,发送给通信对方。ChannelOutboundInvoker
存在该方法。主动关闭当前连接,通过 ChannelPromise 设置操作结果并进行结果通知,无论操作是否成功,都可以通过 ChannelPromise 获取操作结果。该操作会级联触发 ChannelPipeline 中所有 ChannelHandler 的 ChannelOutboundHandler.close(ChannelHandlerContext, ChannelPromise) 事件。ChannelOutboundInvoker
存在该方法。请求断开与远程通信对端端连接并使用 ChannelPromise 来获取操作结果的通知消息。该方法会级联触发 ChannelOutboundHandler.disconnect(ChannelHandlerContext, ChannelPromise) 事件。ChannelOutboundInvoker
存在该方法。客户端使用指定的服务端地址 remoteAddress 发起连接请求,如果连接因为应答超时而失败,ChannelFuture 中的操作结果就是 ConnectTimeoutException 异常;如果连接被拒绝,操作结果为 ConnectException。该方法会级联触发ChannelOutboundHandler.connect(ChannelHandlerContext, SocketAddress, SocketAddress,ChannelPromise) 事件。ChannelOutboundInvoker
存在该方法。绑定指定的本地 Socket 地址 localAddress,该方法会级联触发 ChannelOutboundHandler.bind(ChannelHandlerContext, SocketAddress, ChannelPromise) 事件。我们知道,Netty 这边主要的分为 服务器端 Channel 和客户端 Channel。服务器端 Channel 关系图如下:
客户端 NioSocketChannel 如下:
本章我们了解了 Netty 的 Channel 相关信息,粗略的讲解了一下里面的常用函数,了解了 Channel 相关的类关系图。