Netty学习笔记(10)——Netty中的Channel组件

原创
2019/11/18 16:08
阅读数 112

1. Channel的功能

    1. 与NIO中的Channel一样,它实现了网络操作的抽象类,聚合了一系列的网络IO功能,包括读写数据、建立连接、关闭连接等功能。通过外观模式,将数据读写、连接建立与断开等操作封装到一个接口中,统一对外提供。相比于NIO中的Channel,Netty提供的Channel相关组件使用起来更加灵活方便。

    2. API功能介绍:

(1)Channel read():从当前的Channel中读取数据到第一个inbound缓冲区,如果数据被成功读取,那么就会触发Channel读取事件,并且回调ChannelHandler.channelRead(ChannelHandlerContext, Object)方法;读取完成后,就会触发读取完成事件,并且调用ChannelHandler.channelReadComplete(ChannelHandlerContext)方法。

(2)ChannelFuture write(Object msg):将msg通过ChannelPipeline写入到当前Channel中,但是该方法并没有真正的将数据写入到Channel中,而是将数据暂时保存再一个数组中,直到调用Channel的flush方法才会进行发送。

(3)ChannelFuture write(Object msg, ChannelPromise promise):功能与ChannelFuture write(Object msg)相同,但是携带了ChannelPromise参数设置写入操作的结果,是ChannelFuture的子接口,其实作用差不多和ChannelFuture 一样的,就是用来获取write操作的结果,依据对应的结果进行对应的操作。

(4)ChannelFuture writeAndFlush(Object msg)和ChannelFuture writeAndFlush(Object msg, ChannelPromise promise):写操作,但是会自动将写入的数据自动发送,也就是相当于调用了write方法和flush两个方法。

(5)Channel flush():发送写入的数据。

(6)ChannelFuture close(ChannelPromise promise):主动关闭当前连接,通过设置的ChannelPromise来进行事件完成的回调方法,无论操作是否成功,都可以通过ChannelPromise来获取close操作的执行结果,并且该操作会ChannelPipeline中所有的ChannelHandler的close(ChannelHandlerContext, ChannelPromise)事件。

(7)ChannelFuture disconnect()/ChannelFuture disconnect(ChannelPromise promise):请求断开远程连接,可以选择通过ChannelPromise来接收处理结果的通知,该方法会触发ChannelHandler的disconnect(ChannelHandlerContext, ChannelPromise)事件。

(8)ChannelFuture connect(SocketAddress remoteAddress):该方法主要用于建立连接,remoteAddress为指定的目标IP地址,ChannelFuture 中会保存着连接操作的处理结果,如果连接超时,操作结果为ConnectTimeoutException,如果目标ip拒绝建立连接,操作结果为ConnectException。该方法还会级联触发ChannelHandler#connect(ChannelHandlerContext, SocketAddress, SocketAddress, ChannelPromise)事件。

  • ChannelFuture connect(SocketAddress remoteAddress, SocketAddress localAddress):重载方法,该方法localAddress是表示首先绑定本地的ip地址,然后再发起连接请求。
  • ChannelFuture connect(SocketAddress remoteAddress, ChannelPromise promise):重载方法,该方法中的ChannelPromise 表示将连接操作结果保存到该对象中,当然,返回的ChannelFuture 对象中同样也有处理结果。
  • ChannelFuture connect(SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise):重载方法

(9)ChannelFuture bind(SocketAddress localAddress)/ChannelFuture bind(SocketAddress localAddress, ChannelPromise promise):绑定本地IP地址,该方法会触发ChannelHandler的bind(ChannelHandlerContext, SocketAddress, ChannelPromise)事件。

(10)ChannelConfig config():获取当前Channel的配置信息,比如连接超时时间等。

(11)boolean isOpen():判断当前Channel是否开启

(12)boolean isRegistered():判断当前Channel是否注册到EventLoop中。

(13)boolean isActive():判断当前Channel是否为激活状态并且处于已连接状态。

(14)ChannelMetadata metadata():返回当前Channel的元数据,包括TCP参数配置等

(15)SocketAddress localAddress():返回当前Channel绑定的本地IP地址和端口

(16)SocketAddress remoteAddress():返回连接的远程IP地址和端口

(17)EventLoop eventLoop():该方法是Channel中非常常用的一个方法,在使用Channel是会将Channel注册到EventLoop 的多路复用器中,然后我们需要通过该方法来获取当前Channel注册的EventLoop EventLoop 就相当于NIO中的Selector。

目前仅以各个组件的功能应用为主进行学习,后期完整了解各个组件之间的运用后,在详细学习底层原理。

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部