网络编程之NIO

传统的BIO(Blocking IO)的缺点:

  1、基于阻塞式IO建立起来的,导致服务端一直阻塞等待着客户端发起请求,如果客户端不发起,服务端的的业务线程会一直存。

  2、弹性伸缩能力差,线程数和客户端数是1:1的关系,服务器压力大。

  3、多线程非常耗资源。

NIO(Non-blocking IO)优点:

  1、基于非阻塞IO构建的,服务端建立一个单线程的Selector来管理与所有客户端接入的Socket连接,并负责监听每个连接所关心的事件。

  2、弹性伸缩能力加强了,服务端和客户端比例是1:M的关系。

  3、单线程节省资源,节省了之前的BIO的多线程的花费的资源。

NOI核心:

  1、channel 双向性;2、非阻塞性;3、操作唯一性(给予数据块的操作只能使用buffer);

  2、Buffer的四核属性,capacity 容量,Position 位置,Limit上限,Mark 标记

  3、Selector 选择器(多路复用器)

NIO编程实现步骤:

  1、创建Selector

  2、创建ServerSocketChannel,并绑定监听端口

  3、将channel设置为非阻塞模式

  4、将channel注册到selector上,监听连接事件

  5、循环调用selector的select方法,检测就绪情况

  6、调用的selectedKeys方法获取就绪channel集合

  7、判断事件就绪种类,调用相应的业务处理方法

  8、根据业务需要决定是否有需要再次注册监听事件,重复执行第三步操作

缺陷分析:

  客户端的断连重连,网络闪断,段包读写,失败缓存,网络阻塞,异常码流,在可靠能力补全方面投入的时间和成本将是非常巨大的,原生NIO雨哦一个bug一直能没有改好,主要出现在类Linux操作系统上,根据API规定,调用selector的select方法时如果没有准备就绪的channel他应该阻塞在select的调用上,但linux下的selector使用的是depool IO事件通知工具,操作系统使用这一高性能的技术与网络协议栈异步工作,导致就算没有就绪的channel也不会阻塞,该问题发生概率较低。

 

原文地址:https://www.cnblogs.com/niuyg928/p/11181581.html