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){

//循环读取数据

扫描二维码关注公众号,回复: 2376915 查看本文章

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模型)

猜你喜欢

转载自blog.csdn.net/tangyin_007/article/details/79971069