Netty简介
Netty是一个NIO client-server框架,使用Netty可以快速开发网络应用,例如服务器和客户端协议。Netty提供了一种新的方式来开发网络应用程序,这种新的方式使得它容易使用和有很强的扩展性。Netty的内部实现很复杂,但是Netty提供了简单易用的api从网络处理代码中解耦业务逻辑。Netty是完全基于NIO实现,所以整个Netty都是异步的。网络应用程序通常需要有较高的可扩展性,无论是Netty还是其他的基于Java NIO的框架,都会提供可扩展的解决方案。Netty中一个关键的组成部分是它的异步特性。
Netty架构组成
Hello World
回顾NIO通信步骤:
- 创建ServerSocketChannel,为他配置非阻塞模式。
- 绑定监听,配置TCP参数,录入backlog大小等。
- 创建一个独立的IO线程,用于轮询多路复用器Selector。
- 创建Selector,将之前的ServletSocketChannel注册到Selector上,并配置监听标识位SelectionKey.ACCEPT。
- 启动IO线程,在循环体中执行Selector.select()方法,轮询就绪的通道。
- 当轮询到处于就绪的通道时,需要进行判断操作位,如果是ACCEPT状态,说明是新的客户端接入,则调用accept方法接受新的客户端。
- 设置新接入客户端的一些参数,如非阻塞,并将其通道继续注册到Selector之中,设置监听标识位等。
- 如果轮询的通道操作位是READ,则进行读取,构造Buffer对象等。
- 更细节的还有数据没发送完成继续发送的问题…
一个简单的NIO服务端程序就是如此复杂,我们来看看Netty完成这件事情需要的步骤。Netty实现通信的步骤:
- 创建两个NIO线程组,一个专门用于网络时间处理(接受客户端的连接),另一个则进行网络通信的读写。
- 创建一个ServerBootstrap对象,配置Netty的一系列参数,例如接受传出数据的缓存大小等待。
- 创建一个实际处理数据的类ChannelInitializer,进行初始化的准备工作,比如设置接受传出数据的字符集、格式、已经实际处理数据的接口。
- 绑定端口,执行同步阻塞方法等待服务器启动即可。
1 | public class Server { |
1 | public class ServerHandler extends ChannelHandlerAdapter{ |
1 | public class Client { |
1 | public class ClientHandler extends ChannelHandlerAdapter{ |