目录
0、总结:
1、BIO(Blocking I
O)
同步阻塞模型,一个客户端连接对应一个处理线程。
应用场景:
BIO 方式适用于连接数目比较小且固定的架构, 这种方式对服务器资源要求比较高, 但程序简单易理解。
2、NIO(Non Blockin
g IO)
同步非阻塞,
服务器实现模式为一个线程可以处理多个请求(连接),客户端发送的连接请求都会注册到
多路复用器selector上,多路复用
器轮询到连接有IO请求就进行处理。
应用场景:
NIO方式适用于连接数目多且连接比较短(轻操作) 的架构, 比如聊天服务器, 弹幕系统, 服务器间通讯,编程比较复杂, JDK1.4 开始支持
3、AIO(NIO
2.0)
异步非阻塞,
由操作系统完成后回调通知服务端程序启动线程去处理, 一般适用于连接数较多且连接时间较长的应用。是在NIO的基础上进一步封装的。
应用场景:
AIO方式适用于连接数目多且连接比较长(重操作) 的架构,JDK7 开始支持
=============================================================
IO模型精讲
IO模型就是说用什么样的通道进行数据的发送和接收,Java共支持3种网络编程IO模式:
BIO,NIO,AIO
一、BIO(Blocking IO) 同步阻塞模型,
一个客户端连接对应一个处理线程。
缺点:
1、IO代码里read操作是阻塞操作,如果连接不做数据读写操作会导致线程阻塞,浪费资源。
2、如果线程很多,会导致服务器线程太多,压力太大。
应用场景:
BIO 方式适用于连接数目比较小且固定的架构, 这种方式对服务器资源要求比较高, 但程序简单易理解。
BIO代码示例:
package my.mark.mybaibaoxiang.netty.bio;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9000);
while (true) {
System.out.println("等待连接。。");
//阻塞方法
Socket socket = serverSocket.accept();
System.out.println("有客户端连接了。。");
//如果服务端不用异步线程,而是同步阻塞了,别的客户端将无法建立连接。
new Thread(new Runnable() {
@Override
public void run() {
try {
handler(socket);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
//handler(socket);
}
}
private static void handler(Socket socket) throws IOException {
System.out.println("thread id = " + Thread.currentThread().getId());
byte[] bytes = new byte[1024];
System.out.println("准备read。。");
//接收客户端的数据,阻塞方法,没有数据可读时就阻塞
int read = socket.getInputStream().read(bytes);
System.out.println("read完毕。。");
if (read != -1) {
System.out.println("接收到客户端的数据:" + new String(bytes, 0, read));
System.out.println("thread id = " + Thread.currentThread().getId());
}
socket.getOutputStre

本文深入讲解了Java中的三种网络编程IO模型:BIO(同步阻塞)、NIO(同步非阻塞)及AIO(异步非阻塞)。分别介绍了它们的工作原理、优缺点以及适用场景,并提供了详细的代码示例。

5455

被折叠的 条评论
为什么被折叠?



