一、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. ant 注意

    nt文件在部署时,如果控制台出现乱码则需要调整语言. 高版本eclipse在jdk高版本中已经植入了ant的部署.因此不需要单独配置ant.jar. 如果版本低,可下载ant插件,或者下载ant的工具 ...

  2. jdk下载--操作系统

    不同的操作系统需要下载不同的jdk. 查看操作系统的命令: Window系统下:>winver Linux和Unix系统下: >uname -a 根据系统不同选用不同的jdk: 下载地址: ...

  3. 模板引擎-freemarker

    Freemarker 是一款模板引擎,是一种基于模版生成静态文件的通用 工具,它是为java程序员提供的一个开发包. 可通过将Word或者Excel模板另存为xml格式,在其中修改要替换的内容. 基本 ...

  4. Others-接口集成方式

    1. 异步通信方式可分为不互锁.半互锁和全互锁三种类型: a.不互锁方式 主模块发出请求信号后,不等待接到从模块的回答信号,而是经过一段时间.确认从模块已收到请求信号后,便撤消其请求信号:从设备接到请 ...

  5. C# 获取文件名、目录、后缀、无后缀文件名、扩展名、根目录等

    [csharp] view plain copy class Program { static void Main(string[] args) { //获取当前运行程序的目录 string file ...

  6. Java多线程之使用ATM与柜台对同一账户取钱

    钱数要设置成静态的变量,两种取钱方式操作的是同一个银行账户! 废话不多说,直接上代码.注释写的都很详细!!! package com.thread.multi2; public class Bank ...

  7. 获取request错误信息

    from: https://stackoverflow.com/questions/19370436/get-errno-from-python-requests-connectionerror 当使 ...

  8. Recursion递归

    /*java.lang 核心包 如 String Math Integer System Thread等 拿来直接用 * java.awt 窗口工具 GUI * java.net 网络包 * java ...

  9. 吴裕雄 数据挖掘与分析案例实战(10)——KNN模型的应用

    # 导入第三方包import pandas as pd # 导入数据Knowledge = pd.read_excel(r'F:\\python_Data_analysis_and_mining\\1 ...

  10. SOA (面向服务的架构)

    面向服务的体系结构,是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台.操作系统和编程语 ...