网络编程-BIO和NIO的理解

目录

 

1.BIO和NIO简介

2.BIO和NIO实现模型

3.NIO和BIO各自优势

4.NIO通信关键说明

5.NIO实现代码说明

6.Thrift Server线程模型

7.TThreadedSelectorServer


1.BIO和NIO简介

BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善;

NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送连接请求都会注册到多路复用器上,多路复用器轮训到连接有I/O请求时才启动一个线程进行处理;

AIO(NIO.2):异步非阻塞式IO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理;

2.BIO和NIO实现模型

BIO 
同步阻塞式IO,相信每一个学习过操作系统网络编程或者任何语言的网络编程的人都很熟悉,在while循环中服务端会调用accept方法等待接收客户端的连接请求,一旦接收到一个连接请求,就可以建立通信套接字在这个通信套接字上进行读写操作,此时不能再接收其他客户端连接请求,只能等待同当前连接的客户端的操作执行完成。 
如果BIO要能够同时处理多个客户端请求,就必须使用多线程,即每次accept阻塞等待来自客户端请求,一旦受到连接请求就建立通信套接字同时开启一个新的线程来处理这个套接字的数据读写请求,然后立刻又继续accept等待其他客户端连接请求,即为每一个客户端连接请求都创建一个线程来单独处理,大概原理图就像这样: 

虽然此时服务器具备了高并发能力,即能够同时处理多个客户端请求了,但是却带来了一个问题,随着开启的线程数目增多,将会消耗过多的内存资源,导致服务器变慢甚至崩溃,NIO可以一定程度解决这个问题。

NIO 
同步非阻塞式IO,关键是采用了事件驱动的思想来实现了一个多路转换器。 
NIO与BIO最大的区别就是只需要开启一个线程就可以处理来自多个客户端的IO事件,这是怎么做到的呢? 
就是多路复用器,可以监听来自多个客户端的IO事件: 
A. 若服务端监听到客户端连接请求,便为其建立通信套接字(java中就是通道),然后返回继续监听,若同时有多个客户端连接请求到来也可以全部收到,依次为它们都建立通信套接字。 
B. 若服务端监听到来自已经创建了通信套接字的客户端发送来的数据,就会调用对应接口处理接收到的数据,若同时有多个客户端发来数据也可以依次进行处理。 
C. 监听多个客户端的连接请求和接收数据请求同时还能监听自己时候有数据要发送。 

总之就是在一个线程中就可以调用多路复用接口(java中是select)阻塞同时监听来自多个客户端的IO请求,一旦有收到IO请求就调用对应函数处理。 

3.NIO和BIO各自优势

各自应用场景 

到这里你也许已经发现,一旦有请求到来(不管是几个同时到还是只有一个到),都会调用对应IO处理函数处理,所以:

(1)NIO适合处理连接数目特别多,但是连接比较短(轻操作)的场景,Jetty,Mina,ZooKeeper等都是基于java nio实现。

(2)BIO方式适用于连接数目比较小且固定的场景,这种方式对服务器资源要求比较高,并发局限于应用中。

4.NIO通信关键说明

Java NIO(New IO)是Java的一种IO API的替代(New IO在Java 1.4加入),意味着可以替代标准的Java IO和Java网络API。Java NIO提供了与标准IO API不同的IO处理方式。

Java NIO: Channels and Buffers

在标准IO API中,可以处理字节流和字符流。在NIO中,您使用通道和缓冲区。数据总是从通道读入缓冲区,或从缓冲区写入通道。

Java NIO: Non-blocking IO

Java NIO 使您能够执行非阻塞IO。例如,线程可以请求通道将数据读入缓冲区。当通道将数据读入缓冲区时,线程可以执行其他操作。一旦数据被读入缓冲区,线程就可以继续处理它。向通道写入数据也是如此。

Java NIO: Selectors

Java NIO包含“选择器(Selectors)”的概念。选择器(Selectors)是一个对象,它可以监视多个通道中的事件(如:连接打开、数据到达等)。因此,一个线程可以监视多个通道的数据。

5.NIO实现代码说明

NIO其实是NewIO(1.4版本引入),用以跟之前的版本的java IO库区分(因为NIO也可以工作在阻塞模式)。另外,NIO在linux上实际上是基于IO多路复用(epoll)机制实现的,而不是简单的nonblocking模型(以上个人观点,欢迎反驳)。当然其主要卖点确实是非阻塞,所以这个问题也不是很大。

本文想讨论了都是网络编程范围的,所以先看一个基于NIO的网络通信的栗子。Server端:

public class NioStringServer e
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值