Netty概述
- Netty是什么?
Netty是一个基于NIO的客户、服务器端编程框架
- Netty优缺点?
Netty的核心组件
- Channel
Channel是 Java NIO的一个基本构造,是传输网络数据的通道,
可以把 Channel 看作是传入(入站)或者传出(出站)数据的载体,它可以被打开或者被关闭,连接或者断开连接
- 回调
一个回调其实就是一个方法,一个指向已经被提供给另外一个方法的方法的引用。这使得后
者可以在适当的时候调用前者
- Future
Future 提供了另一种在操作完成时通知应用程序的方式。这个对象可以看作是一个异步操
作的结果的占位符;它将在未来的某个时刻完成,并提供对其结果的访问
- 事件和 ChannelHandler
出站、入站操作会触发一系列事件,每个事件都可以被分发给 ChannelHandler 类中的某个实现的方法
附: 可以认为ChannelHanlder的实例都类似于一种为了响应特定事件而被执行的回调
Netty 的组件和设计
- Channel接口
Channel接口封装了socket,大大降低了直接使用socket类的复杂性,用以实现基本的I/O操作(bind、connect、read、write)
- EventLoop接口
可以看做是一个线程,用以处理连接的生命周期中所发生的事件
- 一个 EventLoopGroup 包含一个或者多个 EventLoop
- 一个 EventLoop 在它的生命周期内只和一个 Thread 绑定
- 所有由 EventLoop 处理的 I/O 事件都将在它专有的 Thread 上被处理
- 一个 Channel 在它的生命周期内只注册于一个 EventLoop
- 一个 EventLoop 可能会被分配给一个或多个 Channel
注意,在这种设计中,一个给定 Channel 的 I/O 操作都是由相同的 Thread 执行的,实际上消除了对于同步的需要
- ChannelFuture接口
Netty中所有的I/O操作都是异步的,一个操作可能不会立即返回,我们需要一种在之后的某个时间点确定其结果的方法.为此,Netty 提供了ChannelFuture 接口,其 addListener()方法注册了一个 ChannelFutureListener,以便在某个操作完成时(无论是否成功)得到通知
- ChannelHandler接口
充当了所有处理入站和出站数据的应用程序逻辑的容器
- ChannelPipeline
ChannelHanlder的容器
- 编码器和解码器
网络数据总是一系列字节
- 抽象类 SimpleChannelInboundHandler
最常见的情况是,你的应用程序会利用一个 ChannelHandler 来接收解码消息,并对该数据应用业务逻辑。要创建一个这样的 ChannelHandler,你只需要扩展基类 SimpleChannelInboundHandler<T>其中 T 是你要处理的消息的 Java 类型。在这个 ChannelHandler 中,
你将需要重写基类的一个或者多个方法,并且获取一个到 ChannelHandlerContext 的引用,
这个引用将作为输入参数传递给 ChannelHandler 的所有方法