Channel是Netty 网络操作的抽象类,它使用了Facade 模式聚合了一组功能,看到Facade 模式我们应该高兴,由Facade 模式得知,以后关于网络操作我们用Channel 就够了。记住Netty 的这种粗暴,你将会很带感。,还有聚合二字,可以看出Channel 具体实现采用聚合模式,将相关的功能类聚合在Channel 中,由Channel 统一分配和调度,这些都是值得我们去学习的。
Channel 的主要功能包括:
- 网络的读写
- 客户端发起连接、主动关闭连接
- 链路关闭
- 获取通信双方的网络地址
Channel 将数据管道抽象为ChannelPipeline,请移步到ChannelPipeline 相关文章
Channel 的设计理念
上面已经提到了一部分,这里再具体说一下
- 在Channel 接口层,采用 Facade 模式进行统一封装,讲网络I/O 操作、网络I/O 相关联的其他操作封装起来,统一对外提供。
- Channel 接口的定义:大而全,为SocketChannel 和ServerSocketChannel 提供统一试图,由不同子类现实不同的功能,公共功能在抽象父类中实现,最大程度地实现功能和接口的重用。
- 具体实现采用聚合模式而非组合模式,讲相关的功能类聚合在Channel中,由Channel 统一负责分配和调度,功能实现更加灵活。
Channel 的功能介绍

方法的作用基本就在方法名上面,下面挑几个重要的讲一下
ChannelFutrue write(Object msg)
请求讲当前的msg 通过ChannelPipeline 写入数据到目标Channel 中。值得注意的是:write 操作只是将消息存入到消息发送环形数组中,并没有真正被发送,只有调用flush 操作才会被写入到Channel 中,发送给对方。
EventLoop eventLoop()
Channel 需要注册到EventLoop 的多路复用器上,用于处理I/O 时间,通过eventLoop() 方法可以获取到Channel 注册的EventLoop。EventLoop 本质上就是处理网络读写事件的Reactor 线程。在Netty 中,它不仅仅用来处理网络事件,也可以用来执行定时任务和用户自定义NioTask 等任务。
ChannelMetadata metadata()
当创建Socket 的时候需要指出TCP 参数,例如接收和发送TCP 缓冲区大小、TCP 的超时时间、是否重用地址等。在Netty 中,每个Channel 对应一个物理连接,每个连接都有自己的TCP 参数配置。所以Channel 会聚合一个ChannelMetadata 用来对TCP 参数提供元数据描述信息,通过metadata() 方法可以获取当然Channel 的TCP 参数配置
Channel parent()
对于服务端Channel 而言,它的父Channel 为空,对于客户端Channel,它的Channel 就是创建它的ServerSocketChannel。
Channel 的继承关系

网友评论