一、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. unity 设置屏幕旋转

    只允许竖屏: Portrait                    √ Portrait Upside Down √ Landscape Right        × Landscape Left ...

  2. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 处理静态资源

    视频地址:https://www.cctalk.com/v/15114923882788 处理静态资源 无非花开花落,静静. 指定静态资源目录 这里我们使用第三方中间件: koa-static 安装并 ...

  3. scala 基本语法

    1.对于一个二元数组,键值对(k,v) 用map的时候,要取第一个或者第二个元素,用 _1 或者 _2表示. scala> words.take(2)res40: Array[(String, ...

  4. java多线程实例(2)

    public class ThreadDemo05 { public static void main(String args[]) { // 四个售票点应该控制同一个资源 Demo d = new ...

  5. python字符串填充(转)

    ljust()方法返回字符串左对齐的字符串长度宽度.填充是通过使用指定的fillchar(默认为空格).如果宽度小于len(s)返回原始字符串.语法 以下是ljust()方法的语法: str.ljus ...

  6. webdriver简介及浏览器的驱动

     1.webdriver概述:  webdriver(selenium2=selenium1+webdriver)是一种用于web应用程序的自动化测试工具,它提供了一套友好的API,与selenium ...

  7. input上传图片

    1.通过input自身的onchange事件触发: <input id="file" type="file" accept="image/*&q ...

  8. windows server 2008 远程桌面连接数修改--无限连接

    1.开启远程桌面 我的电脑 |  属性 |  远程设置  |  远程 |  进允许运行使用网络级别身份验证的远程桌面的计算机连接(更安全)(N)

  9. [SCOI2007]修车(建图好题)

    [SCOI2007]修车 https://www.lydsy.com/JudgeOnline/problem.php?id=1070 Time Limit: 1 Sec  Memory Limit:  ...

  10. python模块之time模块

    import time #从1970年1月1号凌晨开始到现在的秒数,是因为这一年unix的第一个商业版本上市了,这个最常用# print(time.time()) # 1491574950.23983 ...