Netty Channel

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 的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值