传统的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也不会阻塞,该问题发生概率较低。

网络编程之NIO的更多相关文章

  1. 【Java】网络编程之NIO

    简单记录 慕课网-解锁网络编程之NIO的前世今生 & 一站式学习Java网络编程 全面理解BIO/NIO/AIO 内容概览 文章目录 1.[了解] NIO网络编程模型 1.1.NIO简介 1. ...

  2. 解锁网络编程之NIO的前世今生

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) NIO 内容概览: NIO 网络编程模型 NIO 网络编程详解 NIO 网络编程实战 NIO 网络编程缺 ...

  3. Netty网络编程之NIO概览与简单应用

    >>关于NIO Java NIO即Java Non-blocking IO(Java非阻塞I/O),是Jdk1.4之后增加的一套操作I/O工具包,又被叫做Java New IO. (1)R ...

  4. 网络编程之TCP编程

    网络编程之TCP编程 前面已经介绍过关于TCP协议的东西,这里不做赘述.Java对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信窗口,并通过Socket产生I ...

  5. 网络编程之socket

    网络编程之socket socket:在网络编程中的一个基本组件,也称套接字. 一个套接字就是socket模块中的socket类的一个实例. 套接字包括两个: 服务器套接字和客户机套接字 套接字的实例 ...

  6. [深入浅出WP8.1(Runtime)]网络编程之HttpClient类

    12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类 ...

  7. java网络编程之TCP通讯

    java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, /* *TCP *建立连接,形成传输数据的通道: *在连接中进行大数据量传输: *通过三次握手 ...

  8. python3网络编程之socketserver

    本节主要是讲解python3网络编程之socketserver,在上一节中我们讲到了socket.由于socket无法支持多用户和多并发,于是就有了socket server. socket serv ...

  9. 网络编程之UDP编程

    网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...

随机推荐

  1. linux设置脚本开机自启

    由于在centos7中/etc/rc.d/rc.local的权限被降低了,所以需要赋予其可执行权 chmod +x /etc/rc.d/rc.local 赋予脚本可执行权限假设/opt/script/ ...

  2. Win10安装多个MySQL实例

    Win10安装MySQL-8.0.15 1.下载mysql-8.0.15-winx64.zip安装包,地址如下 https://cdn.mysql.com//Downloads/MySQL-8.0/m ...

  3. 请求路径@PathVariable注释中有点.英文句号的问题(忽略英文句号后面的后缀)

    前端页面请求地址 <video id=example-video width=960 height=540 class="video-js vjs-default-skin" ...

  4. ubuntu报错解决和注意事项

    1.在容器中安装expect报错 [root@kube-node3 target]# docker exec -it 36563e55c42b sh$ sudo apt-get install exp ...

  5. 使用 bash 脚本把 GCE 的数据备份到 GCS

    目录 一.Google Cloud Storge 介绍 1.1.四种存储类别的比较 1.2.需求 1.3.给虚拟机添加授权认证 二.备份操作 2.1 创建存储分区 2.2 上传对象到存储分区 2.3 ...

  6. IDEA在引入Maven项目后Dependencies中在出现红色波浪线

    解决方法: 移除pom.xml中相关依赖,再重新添加即可. 情况及具体解决方法如下: 1.在Maven Project中 Dependencies 出现红色波浪线,如图所示 2.查询本地仓库:jar包 ...

  7. VB6_小林的气象类模块

    前言. [如果使用过程有什么问题可以QQ或邮箱联系我. 1919988942  | w2638301509@gmail.com] ___________________________________ ...

  8. JPG文件结构分析

    [转自网络  作者:一 江秋水] 一.简述 JPEG是一个压缩标准,又可分为标准 JPEG.渐进式JPEG及JPEG2000三种: ①标准JPEG:以24位颜色存储单个光栅图像,是与平台无关的格式,支 ...

  9. OpenCV.用户选择

    1.Pdf.P153(书.P122) 2. // 来自:"Creating a video with OpenCV — OpenCV 2.4.13.7 documentation.html& ...

  10. Java学习笔记-抽象类与接口

    抽象类用于在类中不用具体实现,而在子类中去实现的类 抽象类 抽象类概述 抽象定义:抽象就是从多个事物中将共性的,本质的内容抽取出来 抽象类:Java中可以定义没有方法体的方法,该方法的具体实现由子类完 ...