Netty学习指北02
Netty网络抽象的代表
Channel
,EventLoop
,ChannelFuture
结合在一起可以被认为是网络抽象的代表.
Channel->Socket
基本的I/O操作(bind,connect,read,write
)依赖于底层网络传输所提供的原语.
在基于Java的网络编程中,其基本的构造是class Socket
.Netty
的Channel
接口锁提供的API,
大大的降低了直接使用Socket
的复杂性.此外,Channel
也是拥有许多预定义的,专门化实现的广泛类层次结构的根,
下面是一个简短的部分清单:
- EmbeddedChannel
- LocalServerChannel
- NioDatagramChannel
- NioSctpChannel
- NioSocketChannel
EventLoop->控制流,多线程处理,并发
EventLoop定义了Netty的核心抽象,用于处理连接的生命周期中所发生的事件.
- 一个
EventLoopGroup
包含一个或者多个EventLoop
. - 一个
EventLoop
在它的生命周期内只和一个Thread
绑定. - 所有由
EventLoop
处理的I/O事件都将在它专有的Thread
上被处理 - 一个
Channel
在它的生命周期内只注册于一个EventLoop
- 一个
EventLoop
可能会被分配给一个或多个Channel
在这种设计中,一个给定Channel
的I/O操作都是由相同的Thread
执行的,实际上消除了对于同步的需要.
ChannelFuture->异步通知
Netty
中所有的I/O操作都是异步的.因此一个操作可能不会立即返回,所以我们需要一种用于在之后某个时间点确定其结果的方法.
为此Netty
提供了ChannelFuture
接口,其addListener()
方法注册了一个ChannelFutureListener
,
以便在某个操作完成时(无论是否成功)得到通知.
可以将ChannelFuture
看作是将来要执行的操作的结果的占位符.
它究竟什么时候被执行则可能取决于若干因素,因此不可能准确的预测,但是可以肯定的是它将会被执行.此外,
所有属于同一个Channel的操作都被保证其将以它们被调用的顺序被执行
ChannelHandler和ChannelPipeline简介
ChannelHandler
ChannelHandler
它充当了所有处理入站和出站数据的应用程序逻辑的容器.
因为ChannelHandler
的方法是由网络事件触发的.
ChannelHandler
可专门用于几乎任何类型的动作,
例如将数据从一种格式转换为另一种格式,或者处理转换过程中所抛出的异常.
ChannelHandler
的子类型(编码器,解码器,SimpleChannelInboundHandler
,
ChannelOutboundHandler
等)将在后面的post中进行分析.
ChannelPipeline
ChannelPipeline
为ChannelHandler
链提供了容器,并定义了用于在该链上传播入站和出站事件流的API.
当Channel
被创建时,它会被自动地分配到它专属的ChannelPipeline
.
ChannelHandler
安装到ChannelPipeline
中的过程:
- 一个
ChannelInitializer
的实现被注册到了ServerBootstrap
中. - 当
ChannelInitializer.initChannel()
方法被调用时,ChannelInitializer
将在ChannelPipeline
上安装一组自定义ChannelHandler
. ChannelInitializer
将它自己从ChannelPipeline
上移除.
当然我们也可以在ChannelHandler
执行中对ChannelPipeline
进行操作
(例如根据业务逻辑对Channel
绑定的ChannelPipeline
进行增加,删除ChannelHandler
等操作).
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
Channel channel = ctx.channel();
// 对指定的Channel绑定的ChannelPipeline进行操作->添加心跳定时器
channel.pipeline().addFirst("idleStateHandler", new IdleStateHandler(maxWaitTimeout, 0, 0, TimeUnit.SECONDS));
}
Reference
- Netty实战
- netty.io
- Netty 4.x User Guide
- Netty用户指南
转载
本文遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。