1. channel接口
基本的IO操作(bind(),connect(),read()和write())依赖于底层网络传输所提供的原语。在基于
Java的网络编程中,其基本的构造是class Socket。
Netty Channel接口所提供的API,大大的降低了直接使用的复杂型EventLoop定义了netty的核心抽象,用于处理连接的生命周期所发生的事件。我们将在第七章中结合netty的线程处理模型上下文对eventloop进行详细的讨论,
- 一个EnvetLoopGroup包含一个或者多个Evnet-Loop;
- 一个EventLoop在他的生命周期内只和一个Tread绑定
- 所有由EventLoop处理的I/O事件都将在他专有的Thread被处理
- 一个Channel在它的生命周期内只注册于一个EventLoop
- 一个EventLoop可能会被分配给一个或多个Channell
在这种设计中,一个给定的Channle的I/O操作都由相同的
Thread执行的,实际上消除了同步的需要
ChannelFuter接口
- netty的所有操作都是异步的。因为一个操作可能不会立即返回,所以我们需要一种用于在之后的某个时间点确定其结果的办法。为此,netty提供了ChannelFuter接口,其addListenter()方法注册了一个ChannnelFutreListener,以便在某个操作完成时(无论是否成功)得到通知
ChannelHandler和ChannelPipLine
- ChannelHandler接口
从应用程序开发人员来看,netty的主要组件是ChannelHandler,它充当了所有入站和出战数据的
应用程序逻辑的容器,这是可行的,因为ChannelHander的方法是由网络事件(其中术语“事件” 的使用非常广泛)触发的。事实上,ChannelHandler可专门用于几乎任何类型的动作,例如将数据从一种格式转换成另外一种格式,或者处理转换过程中所抛出的异常,
ChannelInBoundHandler是一个你将会经常实现的子接口。这种类型的ChannelHandler接受入站时间和出战数据。当你要给连接的客户端发送响应时,也可以从
ChannelInBoudHanlder冲刷数据,应用程序业务逻辑
通常驻留在一个或者多个ChannelInboundHander中
ChannelPipLine接口
ChannellPipLine为ChannelHander链提供了容器,并定义了用于在该链路上传播入站和出战时间流的API,当Channel被创建时,他会被自动地分配到专属的ChannelPipLine.
ChannelHandler安装到ChannelPipLine的过程如下
- 一个ChannelInitliaLizer的实现被注册到了serverBoostrap中
- 当ChannellInitializer.initChannel()方法被调用时,ChannelInitializer将在ChannelpipLine中安装一组自定义ChannelHanderl
- ChannelInitlizer将它自己从ChannnelPipLine中移除
在nety中。有两种发送消息的方式。可以直接写到Channel中,也可以写到Channel-Handler相关联的ChannelHandlerContext对象中。前一种方式会导致消息从Channel-PipLine的尾端开始流动,。后后者将导致消息从ChannnelPipLine中的下一个Channel-Handler开始流动
ChannelHander
- 有许多不同类型的Channel-Hander,各自的功能取决于他们的超类,Netty以适配器的形式提供了大量默认的Channel实现,其旨在简化应用程序处理逻辑的开发过程。
您已经看到了。ChannelPipLine中的每个ChannelHander将负责把事件转发到链中的下一个CahnnelHander。这些适配器器及他们的子类将自动执行这个操作
编码器和解码器
当通过netty发送或者接受一个消息时,就将会发生一次数据转换。入站消息会被解码;也就是说,从字节转换成另一种格式,通常是一个java对象,如果是出战消息,则会发生相反方向的转换,从它当前的格式被编码为字节,对于特定的需要,netty为编码器和解码器提供了不同类型的抽象类。
通常来说,这些基类的名称将类似于ByteToMessageDecoder或MessageToByteEncoder,对于特殊的类型,可能会发现类似于protobufEncode和ProbufDecoder这样的名称-预制的用来支持Goog的Protocol Buffers.
对于入站数据来说,channelRead方法/事件已经被重写了。对于每个从入站Channel读取的消息。这些方法都会被调用。随后,它将调用有由预制的解码器所提供的decode()方法,并将已解码的字节转换成ChannelPipLine中的下一个ChannelInBoundHander
抽象类SimpleChannelInBoundhaner
,其中T是你要处理的消息java类型,在这个Channelhander中,
最重要的办法是channelRead0(Channel-HanderlContext,T)。除了要求不阻塞当前的I/O线程之外,其他具体实现完全取决于业务
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 ggchzzz@163.com