一、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. DataTable转换成实体

    public static class DataTableToEntity { /// <summary> /// 将DataTable数据源转换成实体类 /// </summary ...

  2. @Repository , @Service , @Controller 和 @Component

    用Spring MVC时@Controller注解的类将变成一个Spring MVC的控制器. 不用Spring MVC的情况下, 这四个注解没有区别. 根据注解的语义, 注解在类上面可以提高代码的可 ...

  3. How to Pronounce OF

    How to Pronounce OF Tagged With: OF Reduction Study the OF reduction.  There are many reductions in ...

  4. DataFrame查增改删

    DataFrame查增改删 查 Read 类list/ndarray数据访问方式 dates = pd.date_range(',periods=10) dates df = pd.DataFrame ...

  5. SPARK数据类型

    转自: http://www.cnblogs.com/tuitui1989/p/5331113.html 一.本地向量 有如下几个类: Vector(基类),DenseVector,SparseVec ...

  6. Loadrunner进行参数化

    Loadrunner进行参数化 Loadrunner中进行参数化,这里有三种方法. 对需要多次使用的变量进行参数化,比如登录信息的用户名和密码,首先需要选中需要参数化的值,然后右键选择Replace ...

  7. long类型与int类型的转换

    在数据库中会出现,numberic转换为int出错 在网站中,提交form的时候出现long转int失败会报错,跌了两次坑,还有ajax提交的时候long转int会报错.

  8. ALTER数据库

    alter table dbo.Sheet1$ alter column UserId int null

  9. 如何禁止浏览器自动填充非登陆input的账号和密码?

    发现浏览器填充密码的方式,那就是,找到页面上第一个type为password的input填充.发现了这个规律后,很自然的就想到了,是不是可以在真正的password前面加一个隐藏的password,形 ...

  10. The partial charge density (1)

    ============================================================================================= The pa ...