一、Java IO通信
名词解释:
BIO通信:
      采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端连接,在接收到客户端请求后,为每一个客户端建立一个新的线程负责进行链路处理,处理完成之后,可以通过输出流返回应答给客户端,此时线程销毁。这就是典型的一次请求一次应答模式。
      该模型的最大缺陷就是缺乏弹性伸缩能力,当客户端并发访问量增加以后,服务端的线程个数和客户端的并发访问数成一比一的正比关系,由于线程是Java虚拟机非常宝贵的资源,当线程数膨胀后,系统的性能将急剧下降,随着并发访问量的继续增大,系统将发生线程堆栈溢出,创建新线程失败等问题,最终导致系统宕机或线程僵死,不能对外提供服务,BIO通信模型的特点。
BIO通信模型

伪异步IO通信:
       当有新的客户端接入的时候,将客户端的socket封装成一个task,投递到后端的线程池中进行处理,JDK的线程池维护一个消息队列和N个活跃的线程,对消息队列中的任务,进行相关的处理,当有M个客户端接入的时候,服务端将会创建一个具有N个线程的线程池,来对客户端的请求进行处理,由于线程池可以设置消息队列的大小和最大线程数,因此它的线程占据数是可控的,无论多少个客户端并发访问,都不会导致客户的耗尽和宕机,但是,同样存在不足之处,当有大量的客户端接入的时候,随着并发访问量的不断增加,伪异步IO通信可能造成线程池的阻塞。
(与BIO区别:服务端不在针对每一个客户端来创建一个独立的线程,由一个线程池来处理所有客户端的接入。)
伪异步IO通信模型

NIO通信:
      缓冲区Buffer它是一个对象,包含一些要写入和读出的数据,在NIO类库中加入Buffer对象,体现了新库与原IO 的区别,在面向流的IO中,可以将数据直接写入或将数据读到Stream对象中,在NIO库中,所有数据都是用缓冲区处理的,读取数据的时候,是直接读到缓冲区中的,在写入数据中,是直接写入到缓冲区中,任何时候的访问缓冲区操作,都是通过缓冲区操作的。
      网络数据通过Channel读取和写入,通道与流的不同之处是,通道是双向的,流只是在一个方向上移动,一个流必须是InputStream或者OutputStream的子类,而通道可以进行读和写,或者二者同时进行.
      多路复用器selector,它是JavaNIO编程的基础,提供了选择已经就绪了的任务的能力,selector会不断轮询,注册在其上的Channel,如果某个Channel上发生读和写的事件,那么这个Channel就处于就绪状态,会被selector轮询出来,然后通过selectionKey,可以获取就绪Channel的集合,进行后续的IO操作,由于JDK使用了epoil代替了传统的select实现,所以它并没有最大连接数的限制,可以接入成千上万的客户端,在IO通信领域是一个巨大的进步.
AIO通信:
     1、 是连接注册读写事件和回调函数
     2、读写方法异步
     3、主动通知程序的
 提供了两种方式获取操作结果,第一种方式就是通过Java.Util.concurrent.Future异步类来表示操作的结果,第二种方式就是执行异步操作的时候,传入一个Java..nio.channels.CompletionHandler的接口的实现类作为操作完成回调,AIO的异步套接字通道是真正的异步非阻塞IO,对应于Unix网络编程中的事件驱动IO,它不需要通过多路复用器,对注册的通道进行轮询操作即可实现异步读写,从而简化了NIO的编程模型.
四种IO的对比:
      从客户端的个数角度:
         BIO:IO数是成1比1的对应关系,
         伪异步IO:IO数是成M比N的对应关系.(当有M个客户端接入的时候, 伪异步IO服务端会创建一个有N个线程的线程池,对线程进行处理)
         NIO:是M比1异步通信IO
         AIO:是M比0的对应关系,不需要启动额外的IO线程,是被动回调的
   从IO类型角度:
           BIO:阻塞同步的IO
            伪异步IO:阻塞同步的IO
             NIO:非阻塞同步的IO
              AIO:非阻塞异步的IO
  从API使用难度角度:
             BIO:简单
            伪异步IO:简单
             NIO:非阻塞同步的IO是复杂的
              AIO:比NIO简单,比其他复杂
 从调试难度角度:
              BIO:简单
              伪异步IO:简单
              NIO:非阻塞同步的IO是复杂的
              AIO:比NIO简单,比其他复杂
   从可靠性角度:
              BIO:差
              伪异步IO:比BIO强,也差
              NIO:高
              AIO:高
    从吞吐量角度:
                BIO:低
                伪异步IO:中等
                NIO:高
                AIO:高

Netty学习第二节Java IO通信的更多相关文章

  1. Java IO 通信 All In One

    Java IO 通信 All In One Netty / WebSocket BIO 通信 BIO 即阻塞 I/O,不管是磁盘 I/O 还是网络 I/O,数据在写入 OutputStream 或者从 ...

  2. netty/example/src/main/java/io/netty/example/http/snoop/

    netty/example/src/main/java/io/netty/example/http/snoop at 4.1 · netty/netty https://github.com/nett ...

  3. Netty学习第一节Netty的总体概况

    一.Netty简介 什么是Netty? 1.高性能事件驱动,异步非阻塞的IO加载开源框架. 它是由JBoss提供,用于建立TCP等底层链接.基于Netty可以建立高性能的HTTP服务器,快速开发高性能 ...

  4. Netty 学习笔记(1)通信原理

    前言 本文主要从 select 和 epoll 系统调用入手,来打开 Netty 的大门,从认识 Netty 的基础原理 —— I/O 多路复用模型开始.   Netty 的通信原理 Netty 底层 ...

  5. Java并发包下锁学习第二篇Java并发基础框架-队列同步器介绍

    Java并发包下锁学习第二篇队列同步器 还记得在第一篇文章中,讲到的locks包下的类结果图吗?如下图: ​ 从图中,我们可以看到AbstractQueuedSynchronizer这个类很重要(在本 ...

  6. VUE2.0实现购物车和地址选配功能学习第二节

    第二节 创建VUE实例 购物车项目计划: 1.创建一个vue实例 2.通过v-for指令渲染产品数据 3.使用filter对金额和图片进行格式化 4.使用v-on实现产品金额动态计算 5.综合演示 ① ...

  7. Java学习 第二节

    1.非递归求第四十个斐波那契数 package test; public class fibonacci2 { public static void main(String arg[]) { ; ; ...

  8. 【知了堂学习笔记】java IO流归纳总结

    皮皮潇最近学到了IO流但是感觉这一块要记的东西太多了,所以重API上查阅并总结了以下几点关于IO的知识. 1.File(文件类): File类是文件以及文件夹进行封装的对象,用对象的思想来操作文件和文 ...

  9. 第二节 java基本语法

    在讲解之前首先避免不了的就是对一些枯燥的东西的描述,哈哈哈,学习就是这样的咯 1.注释:什么叫注释呢?就是帮助阅读的同学理解代码的说明,而开发工具不会去理会他.java的注释有哪些呢?主要分为3大类: ...

随机推荐

  1. ABAP-关于COMMIT WORK 和COMMIT WORK AND WAIT

    转载:https://blog.csdn.net/champaignwolf/article/details/6925019 首先说明一点:更新是异步的,更新是由SAP中UPD1和UPD2两个进程执行 ...

  2. Datetime 24小时制

    24小时制: DateTime dt = DateTime.Now; string dt24 = dt.ToString("yyyy-MM-dd HH:mm:ss"); 12小时制 ...

  3. GIS on CentOS 7 之 PostgreSQL & PostGIS

    PostgreSQL & PostGIS 安装postgresql 配置好yum源之后,使用yum info postgresql可发现 postgresql的版本为9.2.23,若想安装最新 ...

  4. makefile 中的赋值

    1. 在makefile 中可以使用后面定义的变量,未定义的变量值为空 = 使用变量时执行赋值操作 := 立即执行赋值操作 ?= 如果没有赋值过,就赋予后面的值 += 将后面的值追加到原来的值后面 参 ...

  5. fio 测试磁盘

    root@rook-test:/# ceph osd status+----+-----------------------------+-------+-------+--------+------ ...

  6. hdoj1078(介绍记忆化搜索及其模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078 思路: 这是一道典型的记忆化搜索模板题. 先介绍记忆化搜索,本质是搜索+DP. 一般说来,动态规 ...

  7. spotlight

    spotlight - 必应词典 美['spɑt.laɪt]英['spɒt.laɪt] n.聚光灯:聚光灯照亮的地方:聚光灯照明圈:媒体和公众的注意 v.用聚光灯照:突出报道(以使公众注意) 网络射灯 ...

  8. vs2013和vs2010的配置

    win10下vs2013和vs2010的相关配置 ------made by siwuxie095 主要是推荐一些vs2013和vs2010的好用的插件和配色方案,下面主要是以vs2013示例 1.首 ...

  9. Bom对象介绍

    1.windows对象 1.windows对象 1_1.alert:显示一段消息和确认按钮的弹出的警告框 我们平时用的alert的全称就是 window.alert("hahah" ...

  10. 无法访问部署在linux上的Tomcat服务器解决方案

    笔者使用环境:CentOS 6.4  Windows7  tomcat7 主要原因是linux开启了防火墙,有两种解决方案,一种是关闭防火墙,另外一种是开放所要访问的端口 1.关闭防火墙(非常不建议) ...