一、网络I/O框架
谈到网络I/O框架,大家通常脑海里边第一个闪现出来的是JAVA BIO(Blocking I/O,阻塞I/O)、JAVA NIO(Non-blocking I/O,非阻塞I/O)和JAVA AIO(Asynchronized I/O,异步I/O)。但是基于原生JDK的I/O组件对网络I/O功能进行实现并用于生产环境略有复杂,以基于JAVA NIO为例,需要开发者自行处理网络连接、事件注册与监听、事件处理、线程池创建与调度等必备操作。因此对原生JDK I/O组件进行必要的封装,仅将事件处理部分暴露出来,交由业务代码使用,是十分有必要的。
Netty就是这样一种封装了底层网络通信、线程池创建、事件注册与监听的网络I/O框架。Netty的主页为:https://netty.io/
二、Netty之前的网络I/O处理方式
假设没有Netty,那么网络I/O处理方式主要有以下几步(远古时代的JAVA BIO的方式我们就不举例了,我们直接用JAVA NIO进行举例)。
对于Server端:
- Open ServerSocketChannel;
- 设置非阻塞;
- 绑定到指定的IP地址和端口;
- Open Selector;
- 将ServerSocketChannel注册到Selector中,由Selector对Channel上的事件进行监听;
- 在循环中执行Selector的select方法,获取Channel上的事件;
- 根据获取的事件类型,调用相关的业务处理代码,比如channel被accept时、可读时、可写时,此时还需要考虑使用线程池来分配多线程对事件进行响应,以提升处理性能。
对于Client端:
- Open SocketChannel;
- 设置非阻塞;
- 连接到Server端的IP地址和端口;
- Open Selector;
- 将SocketChannel注册到Selector中,由Selector对Channel上的事件进行监听;
- 在循环中执行Selector的select方法,获取Channel上的事件;
- 根据获取的事件类型,调用相关的业务处理代码,比如c