NIO 入门

《Netty 权威指南》(第二版)——第二章 NIO 入门。

传统的 BIO 编程

就是最最基础的 Socket 编程了,其缺点就是:每当一个新的客户端接入时,服务端必须创建一个新的线程处理新连接的客户端链路,一个线程只能处理一个客户端连接。这种一线程一连接模型无法应对高并发的场景。
这一小节里,服务器端代码:

1
2
3
4
5
6
7
serverSocket = new ServerSocket(port);
System.out.println("The time server is start in port: " + port);
Socket socket = null;
while (true){
socket = serverSocket.accept();
new Thread(new com.bio.TimeServerHandler(socket)).start();
}

之所以说是“一线程一连接”,因为我们的代码就是这么实现的,这里的“一线程”就是while循环中的new Thread()。但是while循环中的socket = serverSocket.accept();不就是开辟了一个子进程来处理每次 Socket 连接吗?

伪异步 I/O 编程

伪异步 I/O 编程采用了线程池实现,可以避免为每个请求创建一个独立线程造成的线程资源耗尽问题。但是由于它底层依然采用同步阻塞模型,因此无法从根本上解决问题。

NIO 编程

从学习 Netty 以来,一直听说 NIO 这个词。我也有琢磨它到底是什么意思,什么的缩写(百度搜到的有 new I/O,也有 Non-block I/O,所以我看的很迷惑)。现在明白了:New I/O,是官方叫法(原因在于它相对于之前的 I/O 类库是新增的);Non-block I/O,是民间叫法(原因在于 New I/O 这个新增类库就是要让 Java 支持非阻塞 I/O)。