一、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. egret 配置设置

    修改index.html的时候,要主要template文件夹下的web文件夹也有个index.html,两者控制的不一样 初始安装新建项目后调试这样的情况.重新安装引擎和下载egret安装包安装,默认 ...

  2. Spring声明式事务不回滚问题

    疑问,确实像往常一样在service上添加了注解 @Transactional,为什么查询数据库时还是发现有数据不一致的情况,想想肯定是事务没起作用,出现异常的时候数据没有回滚.于是就对相关代码进行了 ...

  3. Ztree学习(-)简单例子

    https://www.cnblogs.com/shinhwazt/p/5828031.html ztree包:https://pan.baidu.com/s/1vOgGm_elF-lF0VowoHw ...

  4. Hibernate的一个问题object references an unsaved transient instance - save the transi5

    1 我做了一对多和多对一的双向关联关系,在User这一方@ManyToOne已经设置了级联Cascade,这样在测试程序中保存User时,Group也应该自动保存,为什么会抛出以下的异常: (我是按着 ...

  5. SpringBoot整合Shiro (二)

    Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码学和会话管理.相比较Spring Security,shiro有小巧.简单.易上手等的优点.所以很多框架都在使用sh ...

  6. Error: Cannot find a valid baseurl for repo: epel

    修改一下/etc/yum.repos.d/epel.repo文件, enable=1改为enable=0

  7. Time range (447392) for take 'Take 001' is larger than maximum allowed(100000).

    http://www.cnblogs.com/lopezycj/archive/2012/05/16/unity3d_tuchao.html https://forum.unity3d.com/thr ...

  8. OC 单例实现

    2. 在.h 文件遵循 <NSCopying,NSMutabalecopying> 3.定义宏,实现任意类型单单例 #define SingleH(name) +(instancetype ...

  9. Bootstrap模态框使用WebUploader点击失效问题解决

    解决 方法一 在上传按钮上监听一个点击事件,如create(),在该函数中重新生成上传按钮 function create(){ uploader.addButton({ id: '#filePick ...

  10. 使用springmvc从页面中获取数据,然后根据获得的参数信息进行修改,如果修改的数据中含有不是基本数据类型的参数。比如传的参数中有Date类型的数据时,需要我们进行参数类型转换。

    1.1 需求 在商品修改页面可以修改商品的生产日期,并且根据业务需求自定义日期格式. 1.2 需求分析 由于日期数据有很多格式,所以springmvc没办法把字符串转换成日期类型.所以需要自定义参数绑 ...