çç»ææ¡ BIO,NIO,AIO çåºæ¬æ¦å¿µä»¥åä¸äºå¸¸è§é®é¢æ¯ä½ åå¤é¢è¯çè¿ç¨ä¸ä¸å¯æç¼ºçä¸é¨åï¼å¦å¤è¿äºç¥è¯ç¹ä¹æ¯ä½ å¦ä¹ Netty çåºç¡ã
- [BIO,NIO,AIO æ»ç»](#bionioaio-æ»ç»)
- [1. BIO \(Blocking I/O\)](#1-bio-blocking-io)
- [1.1 ä¼ ç» BIO](#11-ä¼ ç»-bio)
- [1.2 ä¼ªå¼æ¥ IO](#12-ä¼ªå¼æ¥-io)
- [1.3 代ç 示ä¾](#13-代ç 示ä¾)
- [1.4 æ»ç»](#14-æ»ç»)
- [2. NIO \(New I/O\)](#2-nio-new-io)
- [2.1 NIO ç®ä»](#21-nio-ç®ä»)
- [2.2 NIOçç¹æ§/NIOä¸IOåºå«](#22-nioçç¹æ§nioä¸ioåºå«)
- [1)Non-blocking IOï¼éé»å¡IOï¼](#1non-blocking-ioï¼éé»å¡ioï¼)
- [2)Buffer\(ç¼å²åº\)](#2bufferç¼å²åº)
- [3)Channel \(éé\)](#3channel-éé)
- [4)Selectors\(éæ©å¨\)](#4selectorséæ©å¨)
- [2.3 NIO è¯»æ°æ®ååæ°æ®æ¹å¼](#23-nio-è¯»æ°æ®ååæ°æ®æ¹å¼)
- [2.4 NIOæ ¸å¿ç»ä»¶ç®åä»ç»](#24-nioæ ¸å¿ç»ä»¶ç®åä»ç»)
- [2.5 代ç 示ä¾](#25-代ç 示ä¾)
- [3. AIO \(Asynchronous I/O\)](#3-aio-asynchronous-io)
- [åè](#åè)
# BIO,NIO,AIO æ»ç»
Java ä¸ç BIOãNIOå AIO çè§£ä¸ºæ¯ Java è¯è¨å¯¹æä½ç³»ç»çåç§ IO 模åçå°è£
ãç¨åºåå¨ä½¿ç¨è¿äº API çæ¶åï¼ä¸éè¦å
³å¿æä½ç³»ç»å±é¢çç¥è¯ï¼ä¹ä¸éè¦æ ¹æ®ä¸åæä½ç³»ç»ç¼åä¸åç代ç ãåªéè¦ä½¿ç¨JavaçAPIå°±å¯ä»¥äºã
å¨è®² BIO,NIO,AIO ä¹åå
æ¥å顾ä¸ä¸è¿æ ·å 个æ¦å¿µï¼åæ¥ä¸å¼æ¥ï¼é»å¡ä¸éé»å¡ã
**忥ä¸å¼æ¥**
- **忥ï¼** 忥就æ¯åèµ·ä¸ä¸ªè°ç¨åï¼è¢«è°ç¨è
æªå¤çå®è¯·æ±ä¹åï¼è°ç¨ä¸è¿åã
- **弿¥ï¼** 弿¥å°±æ¯åèµ·ä¸ä¸ªè°ç¨åï¼ç«å»å¾å°è¢«è°ç¨è
çååºè¡¨ç¤ºå·²æ¥æ¶å°è¯·æ±ï¼ä½æ¯è¢«è°ç¨è
并没æè¿åç»æï¼æ¤æ¶æä»¬å¯ä»¥å¤çå
¶ä»ç请æ±ï¼è¢«è°ç¨è
é常ä¾é äºä»¶ï¼åè°çæºå¶æ¥éç¥è°ç¨è
å
¶è¿åç»æã
忥å弿¥çåºå«æå¤§å¨äºå¼æ¥çè¯è°ç¨è
ä¸éè¦çå¾
å¤çç»æï¼è¢«è°ç¨è
ä¼éè¿åè°çæºå¶æ¥éç¥è°ç¨è
å
¶è¿åç»æã
**é»å¡åéé»å¡**
- **é»å¡ï¼** é»å¡å°±æ¯åèµ·ä¸ä¸ªè¯·æ±ï¼è°ç¨è
ä¸ç´çå¾
请æ±ç»æè¿åï¼ä¹å°±æ¯å½å线ç¨ä¼è¢«æèµ·ï¼æ æ³ä»äºå
¶ä»ä»»å¡ï¼åªæå½æ¡ä»¶å°±ç»ªæè½ç»§ç»ã
- **éé»å¡ï¼** éé»å¡å°±æ¯åèµ·ä¸ä¸ªè¯·æ±ï¼è°ç¨è
ä¸ç¨ä¸ç´ççç»æè¿åï¼å¯ä»¥å
å»å¹²å
¶ä»äºæ
ã
ä¸¾ä¸ªçæ´»ä¸ç®åçä¾åï¼ä½ å¦å¦è®©ä½ ç§æ°´ï¼å°æ¶åä½ æ¯è¾ç¬¨åï¼å¨åªéå»ççæ°´å¼ï¼**忥é»å¡**ï¼ãçä½ ç¨å¾®åé¿å¤§ä¸ç¹ï¼ä½ ç¥éæ¯æ¬¡ç§æ°´ç空éå¯ä»¥å»å¹²ç¹å
¶ä»äºï¼ç¶ååªéè¦æ¶ä¸æ¶æ¥ççæ°´å¼äºæ²¡æï¼**忥éé»å¡**ï¼ã忥ï¼ä½ 们家ç¨ä¸äºæ°´å¼äºä¼ååºå£°é³ç壶ï¼è¿æ ·ä½ å°±åªéè¦å¬å°å声åå°±ç¥éæ°´å¼äºï¼å¨è¿æé´ä½ å¯ä»¥é便干èªå·±çäºæ
ï¼ä½ éè¦å»åæ°´äºï¼**弿¥éé»å¡**ï¼ã
## 1. BIO (Blocking I/O)
忥é»å¡I/O模å¼ï¼æ°æ®ç读ååå
¥å¿
é¡»é»å¡å¨ä¸ä¸ªçº¿ç¨å
çå¾
å
¶å®æã
### 1.1 ä¼ ç» BIO
BIOéä¿¡ï¼ä¸è¯·æ±ä¸åºçï¼æ¨¡åå¾å¦ä¸(徿ºç½ç»ï¼ååºå¤ä¸æ)ï¼

éç¨ **BIO é信模å** çæå¡ç«¯ï¼é常ç±ä¸ä¸ªç¬ç«ç Acceptor 线ç¨è´è´£çå¬å®¢æ·ç«¯çè¿æ¥ãæä»¬ä¸è¬éè¿å¨`while(true)` 循ç¯ä¸æå¡ç«¯ä¼è°ç¨ `accept()` æ¹æ³çå¾
æ¥æ¶å®¢æ·ç«¯çè¿æ¥çæ¹å¼çå¬è¯·æ±ï¼è¯·æ±ä¸æ¦æ¥æ¶å°ä¸ä¸ªè¿æ¥è¯·æ±ï¼å°±å¯ä»¥å»ºç«éä¿¡å¥æ¥åå¨è¿ä¸ªéä¿¡å¥æ¥åä¸è¿è¡è¯»åæä½ï¼æ¤æ¶ä¸è½åæ¥æ¶å
¶ä»å®¢æ·ç«¯è¿æ¥è¯·æ±ï¼åªè½çå¾
åå½åè¿æ¥ç客æ·ç«¯çæä½æ§è¡å®æï¼ ä¸è¿å¯ä»¥éè¿å¤çº¿ç¨æ¥æ¯æå¤ä¸ªå®¢æ·ç«¯çè¿æ¥ï¼å¦ä¸å¾æç¤ºã
妿è¦è®© **BIO é信模å** è½å¤åæ¶å¤çå¤ä¸ªå®¢æ·ç«¯è¯·æ±ï¼å°±å¿
须使ç¨å¤çº¿ç¨ï¼ä¸»è¦åå æ¯`socket.accept()`ã`socket.read()`ã`socket.write()` æ¶åçä¸ä¸ªä¸»è¦å½æ°é½æ¯åæ¥é»å¡çï¼ï¼ä¹å°±æ¯è¯´å®å¨æ¥æ¶å°å®¢æ·ç«¯è¿æ¥è¯·æ±ä¹å为æ¯ä¸ªå®¢æ·ç«¯å建ä¸ä¸ªæ°ç线ç¨è¿è¡é¾è·¯å¤çï¼å¤ç宿ä¹åï¼éè¿è¾åºæµè¿ååºçç»å®¢æ·ç«¯ï¼çº¿ç¨éæ¯ãè¿å°±æ¯å
¸åç **ä¸è¯·æ±ä¸åºçé信模å** ãæä»¬å¯ä»¥è®¾æ³ä¸ä¸å¦æè¿ä¸ªè¿æ¥ä¸åä»»ä½äºæ
çè¯å°±ä¼é æä¸å¿
è¦ç线ç¨å¼éï¼ä¸è¿å¯ä»¥éè¿ **çº¿ç¨æ± æºå¶** æ¹åï¼çº¿ç¨æ± è¿å¯ä»¥è®©çº¿ç¨çå建ååæ¶ææ¬ç¸å¯¹è¾ä½ã使ç¨`FixedThreadPool` å¯ä»¥ææçæ§å¶äºçº¿ç¨çæå¤§æ°éï¼ä¿è¯äºç³»ç»æéçèµæºçæ§å¶ï¼å®ç°äºN(客æ·ç«¯è¯·æ±æ°é):M(å¤ç客æ·ç«¯è¯·æ±ççº¿ç¨æ°é)çä¼ªå¼æ¥I/O模åï¼N å¯ä»¥è¿è¿å¤§äº Mï¼ï¼ä¸é¢ä¸è"ä¼ªå¼æ¥ BIO"ä¸ä¼è¯¦ç»ä»ç»å°ã
**æä»¬å设æ³ä¸ä¸å½å®¢æ·ç«¯å¹¶å访é®éå¢å åè¿ç§æ¨¡åä¼åºç°ä»ä¹é®é¢ï¼**
å¨ Java èææºä¸ï¼çº¿ç¨æ¯å®è´µçèµæºï¼çº¿ç¨çå建åéæ¯ææ¬å¾é«ï¼é¤æ¤ä¹å¤ï¼çº¿ç¨çåæ¢ææ¬ä¹æ¯å¾é«çãå°¤å
¶å¨ Linux è¿æ ·çæä½ç³»ç»ä¸ï¼çº¿ç¨æ¬è´¨ä¸å°±æ¯ä¸ä¸ªè¿ç¨ï¼å建åéæ¯çº¿ç¨é½æ¯éé级çç³»ç»å½æ°ã妿并å访é®éå¢å ä¼å¯¼è´çº¿ç¨æ°æ¥å§è¨èå¯è½ä¼å¯¼è´çº¿ç¨å æ æº¢åºãå建æ°çº¿ç¨å¤±è´¥çé®é¢ï¼æç»å¯¼è´è¿ç¨å®æºæè
嵿»ï¼ä¸è½å¯¹å¤æä¾æå¡ã
### 1.2 ä¼ªå¼æ¥ IO
为äºè§£å³åæ¥é»å¡I/Oé¢ä¸´çä¸ä¸ªé¾è·¯éè¦ä¸ä¸ªçº¿ç¨å¤ççé®é¢ï¼åæ¥æäººå¯¹å®ççº¿ç¨æ¨¡åè¿è¡äºä¼åä¸ä¸ä¸å端éè¿ä¸ä¸ªçº¿ç¨æ± æ¥å¤çå¤ä¸ªå®¢æ·ç«¯çè¯·æ±æ¥å
¥ï¼å½¢æå®¢æ·ç«¯ä¸ªæ°Mï¼çº¿ç¨æ± æå¤§çº¿ç¨æ°Nçæ¯ä¾å
³ç³»ï¼å
¶ä¸Må¯ä»¥è¿è¿å¤§äºN.éè¿çº¿ç¨æ± å¯ä»¥çµæ´»å°è°é
线ç¨èµæºï¼è®¾ç½®çº¿ç¨çæå¤§å¼ï¼é²æ¢ç±äºæµ·é并忥å
¥å¯¼è´çº¿ç¨èå°½ã
ä¼ªå¼æ¥IO模åå¾(徿ºç½ç»ï¼ååºå¤ä¸æ)ï¼

éç¨çº¿ç¨æ± åä»»å¡éåå¯ä»¥å®ç°ä¸ç§å«åä¼ªå¼æ¥ç I/O éä¿¡æ¡æ¶ï¼å®ç模åå¾å¦ä¸å¾æç¤ºã彿æ°ç客æ·ç«¯æ¥å
¥æ¶ï¼å°å®¢æ·ç«¯ç Socket å°è£
æä¸ä¸ªTaskï¼è¯¥ä»»å¡å®ç°java.lang.Runnableæ¥å£ï¼æéå°å端ççº¿ç¨æ± ä¸è¿è¡å¤çï¼JDK ççº¿ç¨æ± ç»´æ¤ä¸ä¸ªæ¶æ¯éåå N 个活è·çº¿ç¨ï¼å¯¹æ¶æ¯éåä¸çä»»å¡è¿è¡å¤çãç±äºçº¿ç¨æ± å¯ä»¥è®¾ç½®æ¶æ¯éåç大å°åæå¤§çº¿ç¨æ°ï¼å æ¤ï¼å®çèµæºå ç¨æ¯å¯æ§çï¼æ 论å¤å°ä¸ªå®¢æ·ç«¯å¹¶å访é®ï¼é½ä¸ä¼å¯¼è´èµæºçèå°½å宿ºã
ä¼ªå¼æ¥I/Oéä¿¡æ¡æ¶éç¨äºçº¿ç¨æ± å®ç°ï¼å æ¤é¿å
äºä¸ºæ¯ä¸ªè¯·æ±é½å建ä¸ä¸ªç¬ç«çº¿ç¨é æç线ç¨èµæºèå°½é®é¢ãä¸è¿å 为å®çåºå±ä»»ç¶æ¯åæ¥é»å¡çBIO模åï¼å æ¤æ æ³ä»æ ¹æ¬ä¸è§£å³é®é¢ã
### 1.3 代ç 示ä¾
ä¸é¢ä»£ç 䏿¼ç¤ºäºBIOéä¿¡ï¼ä¸è¯·æ±ä¸åºçï¼æ¨¡åãæä»¬ä¼å¨å®¢æ·ç«¯å建å¤ä¸ªçº¿ç¨ä¾æ¬¡è¿æ¥æå¡ç«¯å¹¶åå
¶åé"å½åæ¶é´+:hello world"ï¼æå¡ç«¯ä¼ä¸ºæ¯ä¸ªå®¢æ·ç«¯çº¿ç¨å建ä¸ä¸ªçº¿ç¨æ¥å¤çã代ç 示ä¾åºèªéªçµä¾ çå客ï¼åå°åå¦ä¸ï¼
[https://www.jianshu.com/p/a4e03835921a](https://www.jianshu.com/p/a4e03835921a)
**客æ·ç«¯**
```java
/**
*
* @author éªçµä¾
* @date 2018å¹´10æ14æ¥
* @Description:客æ·ç«¯
*/
public class IOClient {
public static void main(String[] args) {
// TODO å建å¤ä¸ªçº¿ç¨ï¼æ¨¡æå¤ä¸ªå®¢æ·ç«¯è¿æ¥æå¡ç«¯
new Thread(() -> {
try {
Socket socket = new Socket("127.0.0.1", 3333);
while (true) {
try {
socket.getOutputStream().write((new Date() + ": hello world").getBytes());
Thread.sleep(2000);
} catch (Exception e) {
}
}
} catch (IOException e) {
}
}).start();
}
}
```
**æå¡ç«¯**
```java
/**
* @author éªçµä¾
* @date 2018å¹´10æ14æ¥
* @Description: æå¡ç«¯
*/
public class IOServer {
public static void main(String[] args) throws IOException {
// TODO æå¡ç«¯å¤ç客æ·ç«¯è¿æ¥è¯·æ±
ServerSocket serverSocket = new ServerSocket(3333);
// æ¥æ¶å°å®¢æ·ç«¯è¿æ¥è¯·æ±ä¹å为æ¯ä¸ªå®¢æ·ç«¯å建ä¸ä¸ªæ°ç线ç¨è¿è¡é¾è·¯å¤ç
new Thread(() -> {
while (true) {
try {
// é»å¡æ¹æ³è·åæ°çè¿æ¥
Socket socket = serverSocket.accept();
// æ¯ä¸ä¸ªæ°çè¿æ¥é½å建ä¸ä¸ªçº¿ç¨ï¼è´è´£è¯»åæ°æ®
new Thread(() -> {
try {
int len;
byte[] data = new byte[1024];
InputStream inputStream = socket.getInputStream();
// æåèæµæ¹å¼è¯»åæ°æ®
while ((len = inputStream.read(data)) != -1) {
System.out.println(new String(data, 0, len));
}
} catch (IOException e) {
}
}).start();
} catch (IOException e) {
}
}
}).start();
}
}
```
### 1.4 æ»ç»
卿´»å¨è¿æ¥æ°ä¸æ¯ç¹å«é«ï¼å°äºåæº1000ï¼çæ
åµä¸ï¼è¿ç§æ¨¡åæ¯æ¯è¾ä¸éçï¼å¯ä»¥è®©æ¯ä¸ä¸ªè¿æ¥ä¸æ³¨äºèªå·±ç I/O å¹¶ä¸ç¼ç¨æ¨¡åç®åï¼ä¹ä¸ç¨è¿å¤èèç³»ç»çè¿è½½ãéæµçé®é¢ãçº¿ç¨æ± æ¬èº«å°±æ¯ä¸ä¸ªå¤©ç¶çæ¼æï¼å¯ä»¥ç¼å²ä¸äºç³»ç»å¤çä¸äºçè¿æ¥æè¯·æ±ã使¯ï¼å½é¢å¯¹åä¸çè³ç¾ä¸çº§è¿æ¥çæ¶åï¼ä¼ ç»ç BIO æ¨¡åæ¯æ è½ä¸ºåçãå æ¤ï¼æä»¬éè¦ä¸ç§æ´é«æç I/O å¤çæ¨¡åæ¥åºå¯¹æ´é«çå¹¶åéã
## 2. NIO (New I/O)
### 2.1 NIO ç®ä»
NIOæ¯ä¸ç§åæ¥éé»å¡çI/O模åï¼å¨Java 1.4 ä¸å¼å
¥äºNIOæ¡æ¶ï¼å¯¹åº java.nio å
ï¼æä¾äº Channel , Selectorï¼Bufferçæ½è±¡ã
NIOä¸çNå¯ä»¥ç解为Non-blockingï¼ä¸å纯æ¯Newã宿¯æé¢åç¼å²çï¼åºäºééçI/Oæä½æ¹æ³ã NIOæä¾äºä¸ä¼ ç»BIO模åä¸ç `Socket` å `ServerSocket` ç¸å¯¹åºç `SocketChannel` å `ServerSocketChannel` 两ç§ä¸åç奿¥åééå®ç°,两ç§éé齿¯æé»å¡åéé»å¡ä¸¤ç§æ¨¡å¼ãé»å¡æ¨¡å¼ä½¿ç¨å°±åä¼ ç»ä¸çæ¯æä¸æ ·ï¼æ¯è¾ç®åï¼ä½æ¯æ§è½åå¯é æ§é½ä¸å¥½ï¼éé»å¡æ¨¡å¼æ£å¥½ä¸ä¹ç¸åã对äºä½è´è½½ãä½å¹¶åçåºç¨ç¨åºï¼å¯ä»¥ä½¿ç¨åæ¥é»å¡I/Oæ¥æåå¼åéç忴好çç»´æ¤æ§ï¼å¯¹äºé«è´è½½ãé«å¹¶åçï¼ç½ç»ï¼åºç¨ï¼åºä½¿ç¨ NIO çéé»å¡æ¨¡å¼æ¥å¼åã
### 2.2 NIOçç¹æ§/NIOä¸IOåºå«
妿æ¯å¨é¢è¯ä¸åçè¿ä¸ªé®é¢ï¼æè§å¾é¦å
è¯å®è¦ä» NIO æµæ¯éé»å¡ IO è IO æµæ¯é»å¡ IO 说起ãç¶åï¼å¯ä»¥ä» NIO ç3ä¸ªæ ¸å¿ç»ä»¶/ç¹æ§ä¸º NIO 带æ¥çä¸äºæ¹è¿æ¥åæã妿ï¼ä½ æè¿äºé½åçä¸äºæè§å¾ä½ å¯¹äº NIO å°±æäºæ´ä¸ºæ·±å
¥ä¸ç¹ç认è¯ï¼é¢è¯å®é®å°ä½ è¿ä¸ªé®é¢ï¼ä½ ä¹è½å¾è½»æ¾çåç䏿¥äºã
#### 1)Non-blocking IOï¼éé»å¡IOï¼
**IOæµæ¯é»å¡çï¼NIOæµæ¯ä¸é»å¡çã**
Java NIO使æä»¬å¯ä»¥è¿è¡éé»å¡IOæä½ãæ¯å¦è¯´ï¼å线ç¨ä¸ä»ééè¯»åæ°æ®å°bufferï¼åæ¶å¯ä»¥ç»§ç»åå«çäºæ
ï¼å½æ°æ®è¯»åå°bufferä¸åï¼çº¿ç¨åç»§ç»å¤çæ°æ®ãåæ°æ®ä¹æ¯ä¸æ ·çãå¦å¤ï¼éé»å¡å乿¯å¦æ¤ãä¸ä¸ªçº¿ç¨è¯·æ±åå
¥ä¸äºæ°æ®å°æééï¼ä½ä¸éè¦çå¾
å®å®å
¨åå
¥ï¼è¿ä¸ªçº¿ç¨åæ¶å¯ä»¥å»åå«çäºæ
ã
Java IOçåç§æµæ¯é»å¡çãè¿æå³çï¼å½ä¸ä¸ªçº¿ç¨è°ç¨ `read()` æ `write()` æ¶ï¼è¯¥çº¿ç¨è¢«é»å¡ï¼ç´å°æä¸äºæ°æ®è¢«è¯»åï¼ææ°æ®å®å
¨åå
¥ã该线ç¨å¨æ¤æé´ä¸è½å干任ä½äºæ
äº
#### 2)Buffer(ç¼å²åº)
**IO é¢åæµ(Stream oriented)ï¼è NIO é¢åç¼å²åº(Buffer oriented)ã**
Bufferæ¯ä¸ä¸ªå¯¹è±¡ï¼å®å
å«ä¸äºè¦åå
¥æè
è¦è¯»åºçæ°æ®ãå¨NIOç±»åºä¸å å
¥Buffer对象ï¼ä½ç°äºæ°åºä¸åI/Oçä¸ä¸ªéè¦åºå«ãå¨é¢åæµçI/Oä¸Â·å¯ä»¥å°æ°æ®ç´æ¥åå
¥æè
å°æ°æ®ç´æ¥è¯»å° Stream 对象ä¸ãè½ç¶ Stream ä¸ä¹æ Buffer å¼å¤´çæ©å±ç±»ï¼ä½åªæ¯æµçå
è£
ç±»ï¼è¿æ¯ä»æµè¯»å°ç¼å²åºï¼è NIO å´æ¯ç´æ¥è¯»å° Buffer ä¸è¿è¡æä½ã
å¨NIOåä¸ï¼æææ°æ®é½æ¯ç¨ç¼å²åºå¤ççãå¨è¯»åæ°æ®æ¶ï¼å®æ¯ç´æ¥è¯»å°ç¼å²åºä¸ç; å¨åå
¥æ°æ®æ¶ï¼åå
¥å°ç¼å²åºä¸ã任使¶å访é®NIOä¸çæ°æ®ï¼é½æ¯éè¿ç¼å²åºè¿è¡æä½ã
æå¸¸ç¨çç¼å²åºæ¯ ByteBuffer,ä¸ä¸ª ByteBuffer æä¾äºä¸ç»åè½ç¨äºæä½ byte æ°ç»ãé¤äºByteBuffer,è¿æå
¶ä»çä¸äºç¼å²åºï¼äºå®ä¸ï¼æ¯ä¸ç§Javaåºæ¬ç±»åï¼é¤äºBooleanç±»åï¼é½å¯¹åºæä¸ç§ç¼å²åºã
#### 3)Channel (éé)
NIO éè¿Channelï¼ééï¼ è¿è¡è¯»åã
é鿝ååçï¼å¯è¯»ä¹å¯åï¼èæµçè¯»åæ¯ååçãæ è®ºè¯»åï¼ééåªè½åBuffer交äºãå 为 Bufferï¼ééå¯ä»¥å¼æ¥å°è¯»åã
#### 4)Selectors(éæ©å¨)
NIOæéæ©å¨ï¼èIO没æã
éæ©å¨ç¨äºä½¿ç¨å个线ç¨å¤çå¤ä¸ªééãå æ¤ï¼å®éè¦è¾å°ççº¿ç¨æ¥å¤çè¿äºééã线ç¨ä¹é´çåæ¢å¯¹äºæä½ç³»ç»æ¥è¯´æ¯æè´µçã å æ¤ï¼ä¸ºäºæé«ç³»ç»æç鿩卿¯æç¨çã

### 2.3 NIO è¯»æ°æ®ååæ°æ®æ¹å¼
é常æ¥è¯´NIOä¸çææIO齿¯ä» Channelï¼ééï¼ å¼å§çã
- ä»ééè¿è¡æ°æ®è¯»å ï¼å建ä¸ä¸ªç¼å²åºï¼ç¶å请æ±ééè¯»åæ°æ®ã
- ä»ééè¿è¡æ°æ®åå
¥ ï¼å建ä¸ä¸ªç¼å²åºï¼å¡«å
æ°æ®ï¼å¹¶è¦æ±ééåå
¥æ°æ®ã
æ°æ®è¯»åååå
¥æä½å¾ç¤ºï¼

### 2.4 NIOæ ¸å¿ç»ä»¶ç®åä»ç»
NIO å
å«ä¸é¢å ä¸ªæ ¸å¿çç»ä»¶ï¼
- Channel(éé)
- Buffer(ç¼å²åº)
- Selector(éæ©å¨)
æ´ä¸ªNIOä½ç³»å
å«çç±»è¿è¿ä¸æ¢è¿ä¸ä¸ªï¼åªè½è¯´è¿ä¸ä¸ªæ¯NIOä½ç³»çâæ ¸å¿APIâãæä»¬ä¸é¢å·²ç»å¯¹è¿ä¸ä¸ªæ¦å¿µè¿è¡äºåºæ¬çéè¿°ï¼è¿éå°±ä¸å¤åè§£éäºã
### 2.5 代ç 示ä¾
代ç 示ä¾åºèªéªçµä¾ çå客ï¼åå°åå¦ä¸ï¼
[https://www.jianshu.com/p/a4e03835921a](https://www.jianshu.com/p/a4e03835921a)
客æ·ç«¯ IOClient.java ç代ç ä¸åï¼æä»¬å¯¹æå¡ç«¯ä½¿ç¨ NIO è¿è¡æ¹é ã以ä¸ä»£ç è¾å¤èä¸é»è¾æ¯è¾å¤æï¼å¤§å®¶çç就好ã
```java
/**
*
* @author éªçµä¾
* @date 2019å¹´2æ21æ¥
* @Description: NIO æ¹é åçæå¡ç«¯
*/
public class NIOServer {
public static void main(String[] args) throws IOException {
// 1. serverSelectorè´è´£è½®è¯¢æ¯å¦ææ°çè¿æ¥ï¼æå¡ç«¯çæµå°æ°çè¿æ¥ä¹åï¼ä¸åå建ä¸ä¸ªæ°ç线ç¨ï¼
// èæ¯ç´æ¥å°æ°è¿æ¥ç»å®å°clientSelectorä¸ï¼è¿æ ·å°±ä¸ç¨ IO 模åä¸ 1w 个 while 循ç¯å¨æ»ç
Selector serverSelector = Selector.open();
// 2. clientSelectorè´è´£è½®è¯¢è¿æ¥æ¯å¦ææ°æ®å¯è¯»
Selector clientSelector = Selector.open();
new Thread(() -> {
try {
// 对åºIOç¼ç¨ä¸æå¡ç«¯å¯å¨
ServerSocketChannel listenerChannel = ServerSocketChannel.open();
listenerChannel.socket().bind(new InetSocketAddress(3333));
listenerChannel.configureBlocking(false);
listenerChannel.register(serverSelector, SelectionKey.OP_ACCEPT);
while (true) {
// çæµæ¯å¦ææ°çè¿æ¥ï¼è¿éç1æçæ¯é»å¡çæ¶é´ä¸º 1ms
if (serverSelector.select(1) > 0) {
Set