一、Netty 简述
Netty
是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络 IO 程序。从下方所列举的特性中不难发现 Netty 优点很多。
学习 Netty
需要从了解与 Netty
相关的几个关键类开始,如Bootstrap
、ServerBootstrap
、Channel
、Selector
、ChannelFuture
、EventLoop
、EventLoopGroup
、ChannelHandler
和 Pipeline
等。这些类是 Netty
对网络编程抽象的代表,也是 Netty
的精髓。
二、Bootstrap 和 ServerBootstrap
Bootstrap
和 ServerBootstrap
作为 Netty
的引导类,提供配置 Netty 组件的接口,开发者通过这些接口来定制搭配 Netty 的各个组件,组装出一个健壮、高性能的网络通信模块。
Bootstrap
是 Netty
的客户端引导类,引导客户端进程连接到另一个运行在某个指定主机的指定端口上的服务端进程后进行网络通信。
ServerBootstrap
是 Netty
的服务端引导类,引导一个服务端进程绑定到某个指定的端口,接收来自客户端的网络连接后进行网络通信。
三、Channel
Channel
是 Java NIO 的一个基本构造,从网络编程视角看可把Channel
理解成是对 Socket
操作的封装,所提供的如端口绑定、建立连接、数据读写等 API 降低了直接使用 Socket
的复杂度;Channel
具备以下特性:
- 可获得当前网络连接的通道状态
- 可获得网络连接的配置参数(缓冲区大小等)
- 提供异步的⽹络 I/O 操作,⽐如建⽴连接、绑定端⼝、数据读写等
- 获得
ChannelFuture
实例,并在其上注册监听器⽤于监听 I/O 操作成功、失败、取消时的事件回调。 - 不同协议、不同 I/O 类型的连接都有不同的
Channel
类型与之对应
四、Selector
java.nio.channels.Selector
是 Java 非阻塞 I/O 实现的关键。Selector
管理一组非阻塞 socket
,当这些 socket
中有已就绪可进行 I/O 相关操作的时候,会进行事件通知。使用非阻塞 I/O 比用阻塞 I/O 来处理大量事件相比,处理更快速、更经济。
Selector
被称作多路复⽤器,正是因为借助它可以实现用一个线程监视多个文件句柄,在网络场景中即是一个线程监视多个 socket
句柄。
在 Netty
中即是一个 Selector
可以监视多个 Channel
,监听 I/O 事件,如 OP_ACCEPT(接收连接事件)、OP_CONNECT(连接事件)、OP_READ(读事件)、OP_WRITE(写事件),还可以不断的查询已注册 Channel
是否处于就绪状态,通过一个线程中管理一个Selector
,一个Sel