- Java633
- Distributed189
- Tool133
- Spring102
- MQ89
- Netty88
- Log86
- File72
- RPC65
- SOFA65
- Concurrency60
- IM55
- Memory51
- Apache50
- Engine49
- Net49
- Design Pattern45
- Schedule40
- Lock33
- Basic32
- java31
- JVM26
- Dev24
- Protocol23
- Thread23
- System18
- Network17
- Web17
- SQL11
- Github10
- JMM10
- Jvm10
- Programming Language10
- SSO10
- Safe10
- System-Design10
- ORM10
- Base9
- Go9
- Maven9
- Pattern8
- Theory8
- WEB8
- TOOL7
- Auth6
- Architecture6
- HTTP6
- Python6
- CS4
- Mybatis4
- Concurrent3
- Exception3
- source-code3
- Framework2
- Gateway2
- Http2
- JMS2
- Security2
- Cache2
- DEV1
- Dotnet1
- IO1
- IOC1
- IOS1
- IoT1
- JDBC1
- Best Practice1
- Mybaits1
- PHP1
- Source Code1
- Dubbo1
- MVC1
netty 版本
不同版本的 Netty 实现可能会略有差异,此处版本为:
io.netty
netty-all
4.1.17.Final
netty 版本
不同版本的 Netty 实现可能会略有差异,此处版本为:
io.netty
netty-all
4.1.17.Final
在学习 linux IO 模型 以前,我们先看一组概念,便于大家更好的理解。
linux IO 模型
linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段。

用户空间与内核空间
我们在前面学习了 linux 的 5 种 I/O 模型详解
下面我们一起来学习下如何使用 java 实现 BIO/NIO/AIO 这 3 种不同的网络 IO 模型编程。
BIO 编程
BIO 作为最基础的 IO 版本,实现起来比较简单。


Buffer
Java NIO Buffers用于和NIO Channel交互。正如你已经知道的,我们从channel中读取数据到buffers里,从buffer把数据写入到channels.
jdk7中新增了一些与文件(网络)I/O相关的一些api。这些API被称为NIO.2,或称为AIO(Asynchronous I/O)。
AIO最大的一个特性就是异步能力,这种能力对socket与文件I/O都起作用。

感受了上面的 java 中的 BIO/NIO/AIO 详解,不知道你是否觉得 jdk 直接编程非常麻烦?
还有很多情况需要去考虑处理,还有性能相关的问题、稳定性问题,拓展性问题。
不选择Java原生NIO编程的原因
现在我们总结一下为什么不建议开发者直接使用JDK的NIO类库进行开发,具体原因如下。
(1) NIO的类库和API繁杂,使用麻烦,你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等
我们知道,TCP是以一种流的方式来进行网络转播的,当tcp三次握手建立通信后,客户端服务端之间就建立了一种通讯管道,我们可以想象成自来水管道,流出来的水是连城一片的,是没有分界线的。
TCP底层并不了解上层的业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分。
所以对于我们应用层而言。
我们直观是发送一个个连续完整TCP数据包的,而在底层就可能会出现将一个完整的TCP拆分成多个包发送或者将多个包封装成一个大的数据包发送。
这就是所谓的TCP粘包和拆包。
当发生TCP粘包/拆包会发生什么情况
我们举一个简单例子说明: