网上对NIO的解释有很多,但自己一直没有理解,根据自己的理解画出下面这个图,有什么不对的地方,欢迎留言指出。

理解是,客户端先与通过通道Channel与连接(注册到服务器端),然后再传送数据,服务器端这时候的处理是,服务器端有个Selector多路复用器,它使用轮询的方式去检测Channel的状态,一旦发现Channel读写事件准备就绪后,就会把Channel与数据缓冲区Buffer进行数据传输,进行相关数据的处理。

数据缓冲区Buffer

它一个用于特定基本类型数据的容器。

常用的是ByteBuffer,实际上每一种java基本类型都对应了一种缓冲区(Booolean类型除外),它们都继承了Buffer,是Buffer的子类。分别是:

类名 名称
ByteBuffer 字节缓冲区
CharBuffer 字符缓冲区
ShortBuffer Short缓冲区
IntBuffer int 缓冲区
LongBuffer long缓冲区
DoubleBuffer double缓冲区
FloatBuffer float缓冲区

缓冲区的基本属性包括:内容、容量、限制、位置。

缓冲区的容量 是它所包含的元素的数量。缓冲区的容量不能为负并且不能更改。

缓冲区的限制 是第一个不应该读取或写入的元素的索引。缓冲区的限制不能为负,并且不能大于其容量。

缓冲区的位置 是下一个要读取或写入的元素的索引。缓冲区的位置不能为负,并且不能大于其限制。

多个当前线程使用缓冲区是不安全的。如果一个缓冲区由不止一个线程使用,则应该通过适当的同步来控制对该缓冲区的访问。

通道

像自来水管道一样,网络数据通过Channel读取和写入,通道与流的不同之处在于通道是双向的,而流只能往一个方向上移动(一个流必须是InputStream或者OutStream的子类),而通道可以用于读和写,或者两者同时进行,最关键的还可以与多路复用器结合起来,有多种状态位,方便多路复用器去识别。事实上通道分为两大类,一类是网络读写的(SelectableChannel),另一类是文件操作的(FileChannel

Selector多路复用器

            它类似一个管理者,管理很多通道,然后通过轮询那个通道的数据已经准备好,通知CPU执行数据的读取和写入工作。

java网络编程学习之NIO模型的更多相关文章

  1. Java网络编程学习A轮_01_目标与基础复习

    A. A轮目标 复习网络编程基础知识,重点学习下TCP三次握手四次挥手,以及可能引发的异常情况. 回顾 Socket 编程,好多年没写(chao)过相关代码了. 重学 NIO,以前学的基本忘光了,毕竟 ...

  2. Java 网络编程学习总结

    新手一枚,Java学习中,把自己学习网络编程的知识总结一下,梳理下知识,方便日后查阅,高手莫进. 本文的主要内容: [1]    网络编程认识                [2]  TCP/IP编程 ...

  3. Java网络编程学习笔记

    Java网络编程,我们先来看下面这一张图: 由图可得:想要进行网络编程,首先是服务器端通过ServerSocket对某一个端口进行监听.通过accept来判断是否有客户端与其相连.若成功连上,则通过r ...

  4. java网络编程学习笔记(一)

    1.进程之间的通信 进程是指运行中的程序,进程的任务就是执行程序中的代码. 存在计算机网络上的两个进程只需要关注它们通信的具体内容,而不需关注消息在网络上传输的具体细节. 2.计算机网络的概念 Int ...

  5. Java网络编程学习A轮_08_NIO的Reactor模型

    参考资料: 了解 Java NIO 的 Reactor 模型,大神 Doug Lea 的 PPT Scalable IO in Java 必看:http://gee.cs.oswego.edu/dl/ ...

  6. Java网络编程学习A轮_06_NIO入门

    参考资料: 老外写的教程,很适合入门:http://tutorials.jenkov.com/java-nio/index.html 上面教程的译文:http://ifeve.com/overview ...

  7. Java网络编程学习A轮_07_基于Buffer的Socket编程

    示例代码: https://github.com/gordonklg/study,socket module A. LineSeparate 基于 Buffer 实现逐行读取的 EchoServer ...

  8. Java网络编程学习

    服务器是指提供信息的计算机或程序,客户机是指请求信息的计算机或程序,而网络用于连接服务器与客户机,实现两者相互通信.但有时在某个网络中很难将服务器与客户机区分开.我们通常所说的“局域网”(Local ...

  9. Java网络编程学习A轮_05_Socket编程

    示例代码: https://github.com/gordonklg/study,socket module A. Socket 编程简单例子 最简单的 Socket 编程是通过回车/换行符,整行读取 ...

随机推荐

  1. chrome 安装setupvpn 解决chorme未能成功加载扩展程序的问题

    一: vpn文件    https://pan.baidu.com/s/1wZV2HAC3GHlh1bjlvbilRg 提取码:  gz72; 二 : 安装步骤 ------请看完以下步骤,不要直接拖 ...

  2. vue发送请求---fetch-jsonp

    fetch-jsonp和axios类似,都是第三方插件返送请求,而vue-resource是vue官方提供的请求插件 前两个哪个组件使用就在那里引入,vue-resource直接在vue的main.j ...

  3. Centos7双网卡绑定配置 bonding

    bonding的七种工作模式: bonding技术提供了七种工作模式,在使用的时候需要指定,每种有各自的优缺点,我们使用的是 mode=4 balance-rr (mode=0) 默认, 有高可用 ( ...

  4. HTTP Streaming Architecture HLS 直播点播 HTTP流架构

    小结: 1. 3部分 服务器组件 分发组件 客户端组件 https://developer.apple.com/library/archive/documentation/NetworkingInte ...

  5. hue,kylin,ambari

    apache-kylin https://ambari.apache.org/ https://www.jianshu.com/p/c49c61b654da docker pull sequencei ...

  6. [math] 什么是双曲函数(转发)

    我完全不记得上高中的时候学习过双曲函数...额,暴露了... 原文地址:https://zhuanlan.zhihu.com/p/20042215 可能是最好的讲解双曲函数的文章 零.写在前面 (近期 ...

  7. p12文件和mobileprovision文件

    http://www.cnblogs.com/YouXianMing/p/3848188.html https://www.jianshu.com/p/73c430f468e8 https://blo ...

  8. Logstash - Working with plugins(使用插件)

    本章节开始介绍logstash的插件及功能,插件对于logstash来说非常重要,按类别分为:input.filter.codec.output四种类型. logstash有非常丰富的插件,通过安装目 ...

  9. javascript 的引入

    目录 一.静态引入 1. html标签script引入 2. esm 中import ModuleName from 'module/path' 3. commonjs 中 const ModuleN ...

  10. pyothon学习笔记2-元组

    # 1.元组对象不可修改,元组中列表对象的对象可以修改 t = (1,2,[1,2,3]) t[2] = [1,2,3,4] # 'tuple' object does not support ite ...