IO与NIO网络编程模型
一、BIO(bolcking IO)阻塞分析
阻塞点:
1.创建服务端口
ServerSocket serverSocket=new ServerSocket(12345);
//获取socket套接字
Socket socket=serverSocket.accept();//阻塞等待客户端连接
2.获取客户端输入流
InputStream is=scoket.getInputStream();
byte[] b=new byte[1024];
while(true){
//循环读取数据
int data-=is.read(b);//阻塞等待客户端输入
if(data!=-1){
system.out.println(data);
}else{
break;
}
}
BIO特点:再没有对服务端优化的前提下,1个服务端只能为一个客户端服务(BIO的通讯线程模型)
二、多线程IO
客户端数:线程数=N:N(1:1)
三、伪异步IO
ExecutorService threadPool=Executors.newCachedThreadPool();
特点:不限制线程数量
客户端数:线程数=N:N
ExecutorService threadPool=Executor.newFixedThreadPool(100);
特点:限制线程数量,线程可以复用
客户端数据量:线程数量=N:M(N>=M)
四、NIO(non-blocking IO)
new IO
Non Blocking IO(非阻塞同步IO)
jdk1.7以后,出现AIO(真正意义上的异步非阻塞IO)
Non-Blocking重要概念:
1、Selector(通道的管理器)
2、ServerSocketChannel(关心Accept事件)--->ServerSocket(IO)
3、SocketChannel(关心IO事件read|write|read write)--->Socket(IO)
4、SelectionKey(事件集合)
Reactor/多线程
单线程Reactor问题
多路复用IO通过轮询的方式检查是否有事件到来,然后对到来的事件逐一进行响应,如果此时响应提一旦很大,会导致后续的时间得不到处理,最终导致新的事件轮询延后
解决方案:Netty(基于NIO实现,多线程Reactor模型,主从多线程Reactor模型)