本人小白,学习总结可能有错,发现错误请评论指出,后期修改
文章目录
- BIO,NIO,AIO
- 一、理解
- 二、分类说明
- 1、BIO
- 2、AIO
- 单线程模式(single Thread)
- 多线程模式(reactor模式)
- 3、AIO
一、理解
Java的BIO,NIO,AIO可以看作是java语言对操作系统各种IO模型的封装,
二、分类说明 1、BIO阻塞IO,blocking阻塞。
当客户端每有一个访问service服务器,服务器就会创建一个线程来处理这个访问,有多少个访问就创建多少个线程。Blocking IO这个会发生阻塞的地方有很多,在服务器端,当没有客户端连接会阻塞,服务器的读和写都可能会发生阻塞
客户端代码
public class BIO_Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket();
ss.bind("192.168.9.1", 8888);
while(true){
Socket s = ss.accept();
new Thread(()->{
handler(s);
}).start();
}
}
static void handler(Socket s){
try{
byte[] bytes = new byte[1024];
int lent = s.getInputStream().read(bytes);
System.out.println(new String(bytes,0,lent));
s.getOutputStream().write(bytes,0,lent);
s.getOutputStream().flush();
}catch (IOException e){
e.printStackTrace();
}
}
}
客户端代码
public class BIO_Client {
public static void main(String[] args) throws IOException {
Socket s = new Socket("192.168.9.1",8888);
s.getOutputStream().write("hello server".getBytes());
s.getOutputStream().flush();
System.out.println("write over,waiting for msg back...");
byte[] bytes = new byte[1024];
int len = s.getInputStream().read(bytes);
System.out.println(new String(bytes,0,len));
s.close();
}
}
BIO模型的缺点:当大量客户端链接的时候,效率太低
代码如下(示例):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2、AIO
非阻塞IO
单线程模式(single Thread)在单线程模型下,在客户端和服务器之间有一个选择器(selector),这个选择器的作用如下:
1、每隔一段时间,selector会轮询(监控)一遍服务器,查看是否有客户端要链接服务器,
2、监控已经建立好的连接,查看哪些连接需要写,需要读。
3、当发现需要读和写,或者连接的请求,就立刻处理。
这些监控的事件处理没有顺序。
1、选择器会在服务器的每个接口上添加一个key,用于监控客户端是否有连接的请求
2、当一个客户端连接成功后,会在连接通道上注册读写事件的监控。
在这个模型下,增加了一个线程池,这个线程池的作用是专门处理客户端读写请求。
流程:
1、selector依然会注册对服务器的监听器,用于监听是否有客户端连接请求,然后只处理这类请求
2、当客户端连接成功后,有读写请求(非accept())的时候,select会将这些请i求交给一个线程池的空闲线程来处理。
不需要轮询,并且selector可以有多个。
流程如下:
1、当有客户端请求连接的是后,操作系统贤进行连接,然后通知selector,是否连接成功由selector决定。
2、连接成功的后的读写等请求,依然是交给线程池里边的空闲线程来处理。
学习的视频连接



