Channel简介
channel是netty网络IO操作抽象出来的一个接口,主要功能有:网络IO的读写,客户端发起连接、主动关闭连接,链路关闭,获取通信双方的网络地址等,还提供了与netty框架相关的操作,如获取channel相关联的EventLoop、pipeline等。
为什么不适用JDK NIO原生的Channel而要另起炉灶呢,主要原因如下:
(1)JDK的SocketChannel和ServerSocketChannel的主要职责就是网络I/O操作,由于它们是SPI类接口,由具体的虚拟机厂家来提供,所以通过继承SPI功能类来扩展其功能的难度很大;直接实现ServerSocketChannel和SocketChannel抽象类,其工作量和重新开发一个新的Channel功能类是差不多的。
(2)Netty的Channel需要能够跟Netty的整体架构融合在一起,例如I/O模型,基于ChannelPipeline的定制模型,以及基于元数据描述配置化的TCP参数等,这些JDK的SocketChannel和ServerSocketChanel都没有提供,需要重新封装。
(3)自定义的Channel,功能实现更加灵活。
channel 工作原理
Netty 网络通信的组件,能够用于执行网络 I/O 操作。Channel 为用户提供:
- 当前网络连接的通道的状态(例如是否打开?是否已连接?)
- 网络连接的配置参数 (例如接收缓冲区大小)
- 提供异步的网络 I/O 操作(如建立连接,读写,绑定端口),异步调用意味着任何 I/O 调用都将立即返回,并且不保证在调用结束时所请求的 I/O 操作已完成。
调用立即返回一个 ChannelFuture 实例,通过注册监听器到 ChannelFuture 上,可以 I/O 操作成功、失败或取消时回调通知调用方。 - 支持关联 I/O 操作与对应的处理程序。
Channel的基本方法
Channel read() 从当前的Channel 中读取数据到第一个inbound缓冲中,如果数据 被成功读取
ChannelFuture write 写入
Channel flush() 将之前写入到发送环形数组中的消息全部写入到目标Chanel中,发送给通信对方
ChannelFuture WriteAndFlush(Object msg) 等价于单独调用write 和flush
ChannelFuture close() 主动关闭当前连接
ChannelFuture disconnect()请示断开与远程通信对端的连接并使用ChannelPromise 来获取操作结果的通知消息
ChannelFuture connect(SocketAddress remoteAddress) 客户端使用指定的服务端地址是 remoteAddress发起连接请 求
ChannelFuture bind(SocketAddress localAddress) 绑定指定的本地Socket地址 localAddress():返回此通道绑定的本地地址.
config():返回关于此通道的配置.
isOpen():如果通道打开并且可能稍后激活,则返回true.
isRegistered():如果通道注册了EventLoop,则返回true。
isActive():如果通道处于活动状态并连接,则返回true.
ChannelMetadata metadata() 获取当前Chnnel 的元数据描述信息,包括TCP参数配置
SocketAddress localAddress()获取当前Channel 的本地绑定地址
pipeline():返回分派的ChannelPipeline.
remoteAddress():返回此通道连接到的远程地址.
flush():请求通过ChannelOutboundInvoker将所有挂起的消息输出.
Channel 主要继承关系
Channel 类型:
NioSocketChannel,异步的客户端 TCP Socket 连接。
NioServerSocketChannel,异步的服务器端 TCP Socket 连接。
NioDatagramChannel,异步的 UDP 连接。
NioSctpChannel,异步的客户端 Sctp 连接。
NioSctpServerChannel,异步的 Sctp 服务器端连接,这些通道涵盖了 UDP 和 TCP 网络 IO 以及文件 IO。
ChannelHandler
ChannelHandler 是一个接口,处理 I/O 事件或拦截 I/O 操作,并将其转发到其 ChannelPipeline(业务处理链)中的下一个处理程序。
ChannelHandler 本身并没有提供很多方法,因为这个接口有许多的方法需要实现,方便使用期间,可以继承它的子类:
ChannelInboundHandler 用于处理入站 I/O 事件。
ChannelOutboundHandler 用于处理出站 I/O 操作。
或者使用以下适配器类:
ChannelInboundHandlerAdapter 用于处理入站 I/O 事件。
ChannelOutboundHandlerAdapter 用于处理出站 I/O 操作。
ChannelDuplexHandler 用于处理入站和出站事件。
ChannelPipeline
ChannelPipeline将多个ChannelHandler链接在一起来让事件在其中传播处理。一个ChannelPipeline中可能不仅有入站处理器,还有出站处理器,入站处理器只会处理入站的事件,而出站处理器只会处理出站的数据,下面展示了一个同时具有入站处理器和出站处理器的
EventLoop 和 EventLoopGroup
在 Netty 中每个 Channel 都会被分配到一个 EventLoop。一个 EventLoop 可以服务于多个 Channel。
每个 EventLoop 会占用一个 Thread,同时这个 Thread 会处理 EventLoop 上面发生的所有 IO 操作和事件(Netty 4.0)
EventLoopGroup 是用来生成 EventLoop 的