NIO介绍

NIO即no-blocking IO,表示同步非阻塞IO操作。采用多路复用器,事件驱动机制,当发生io请求时,触发相应的事件,多路复用器中的轮询器即selector轮询到事件,从而交由线程执行。请求发起方发起请求之后并不会被堵塞,可以设置为非堵塞的状态。

三大核心组件

java nio框架中,有三大核心的组件:Buffer、Channel、Selector。其关系图为:

Buffer

buffer即数据缓冲区,用于存储发送或读取Channel中的数据。数据流向是双向的,读写模式的切换需要依赖filp()方法。Buffer中重要的的几个属性。

  • position: 表示当前读取或写入的索引位置。
  • limit:表示当前读取或写入的限制索引位置。(position <= limit)
  • capacity: 表示缓冲区的容量。

buffer中操作数据的方法有:get()读取position位置的数据,put()将数据写入position索引位置。array()直接返回buffer中的数组(数组是final修饰的)。需要注意的是,buffer并不会真正删除数据,而是通过position,limit属性来控制读取和写入的位置,大小。例如,buffer数组初始化时,position为0,limit=capacity。当写入一个数据时,position+1。但需要读取时,如果不仅进行模式切换,此时将从position处开始读取,读取错误的信息。
filp方法是将limit = position ,postion=0等操作,从而限制只能读取写入的数据。

另一个方法clear()方法,将position = 0; limit = capactiy.
buffer的一些实现类如:ByteBuffer、CharBuffer、IntegerBuffer、LongBuffer。操作流程大同小异。

Channel

channel是连接selector的信道,传输信息数据,同时channel需要绑定到selector。
channel重要的种类有:

  1. FileChannel:操作文件
  2. SocketChannel:负责tcp的网络套接字
  3. ServerSockerChannel:负责tcp网络服务端。
  4. DatagramChannel:负责UDP通信

channel中的重要方法:

  • configBlocking(boolean) : 配置该信道是否阻塞。
  • register(Selector,Int)用来绑定selector和事件。
  • read(Buffer)将channel信道中的数据读入到该buffer中

SelectionKey

如果说channel是一条管道,SelectionKey就是一个连接器。一个SelectionKey不仅将一个channel和selector绑定,还将channel触发事件绑定在selector中。SlectionKey中定义的几种事件常量:

  • OP_READ:读事件。
  • OP_WRITE::写事件。
  • OP_CONNECT:套接字连接事件。
  • OP_ACCEPT:套接字接收事件。

SelectionKey的几个重要方法:

  • cannel():返回该SelectionKey绑定的Channel
  • selector():返回该SlectionKey绑定的Selector
  • isReadable(): 判断是否为可读事件。
  • isWritable(): 判断是否为可写事件。
  • isConnectable(): 判断是否为连接事件。
  • isAcceptable(): 判断是否为接受事件。

Selector

轮询器。能够不断的轮询出已经触发事件的channel。Selector主要负责事件的轮询,保存并维护多个不同状态的SelectionKey数组。在本人有限的认知下,selector较重要的属性有:

  • protected Set<SelectionKey> selectedKeys:存储已经触发过事件的SelectionKey
  • protected HashSet<SelectionKey> keys;:存储注册的SelectionKey
  • private Set<SelectionKey> publicKeys; :存储当前触发事件的SelectionKey
  • private Set<SelectionKey> publicSelectedKeys;:存储注册的SelectionKey

他们之间的关系为:

其中publicKeys是keys的不可修改集,publicSelectKeys是selectedKeys的不可成长集。这样做的深意我猜测是为了保护核心数据。
Selector常用的方法有:

  • selectedKeys() :返回publicSelectedKeys数组,即当前触发事件的Key。
  • kdys():返回当前publicSelectedKeys数组。
  • select(): 不断轮询数组,返回触发事件的key的个数。(会阻塞,直到出现触发事件)
  • select(long): 不断轮询数组,返回触发事件的key的个数,(会阻塞,直到出现触发事件或long型的变量的时间到)
  • selectNow(): 轮询数组,返回触发事件的key的个数,(不会阻塞)

需要注意的是,在通过selectedKeys方法返回触发事件的keys数组中,需要使用iterator来进行key的遍历,切记:在处理完该事件之后需要调用iterator.remove()方法去删除selectedKeys中的对应key,否则,下次仍然会重复处理这个key。

使用案例

server端:

client端:

另外

从channel.register()的方法中看,channel在注册进selector中去的时候不仅将形成的selectionKey存进selector中,也将该selector存入进channel中的keys数组中去了。

``

java NIO网络编程相关推荐

  1. 你对Java网络编程了解的如何?Java NIO 网络编程 | Netty前期知识(二)

    本文主要讲解NIO的简介.NIO和传统阻塞I/O有什么区别.NIO模型和传统I/O模型之间的对比.以及围绕NIO的三大组件来讲解,理论代码相结合. 很喜欢一句话:"沉下去,再浮上来" ...

  2. Java NIO网络编程之群聊系统

    概述 对ServerSocketChannel.SocketChannel.SelectionKey有一定的理解和了解对应API. NIO非阻塞网络编程相关关系梳理: 以下概念: ServerSock ...

  3. Netty:Java 领域网络编程的王者

    一.简介 1. 课程背景 分布式系统的根基在于网络编程,而 Netty 是 Java 领域网络编程的王者. 2. 课程内容 第一部分 NIO 编程,三大组件 第二部分 Netty 入门学习,Event ...

  4. NIO网络编程实战之简单多人聊天室

    NIO网络编程实战 利用NIO编程知识,实现多人聊天室. 1. NIO编程实现步骤 第一步:创建Selector 第二步:创建ServerSocketChannel,并绑定监听端口 第三步:将Chan ...

  5. BIO,Socket网络编程入门代码示例,NIO网络编程入门代码示例,AIO 网络编程

    BIO,Socket网络编程入门代码示例 1.BIO服务器端程序 package cn.itcast.bio;import java.io.InputStream; import java.io.Ou ...

  6. java网络编程技术学习笔记(b站【狂神说Java】网络编程实战讲解)

    b站视频链接:[狂神说Java]网络编程实战讲解 文章目录 网络编程 1.1.概述 1.2.网络通信的要素 1.3.IP 1.4.端口 1.5.通信协议 1.6.TCP 文件发送 1.7.UDP 1. ...

  7. Java(网络编程)

    Java(网络编程) 参考视频:1.什么是计算机网络(狂神) 1. 概述 地球村 TCP:打电话 UDP:发短信 计算机网络: 计算机网络是指将地理位置不同的,具有独立功能的,多台计算机及其外部设备, ...

  8. Netty专题-(3)NIO网络编程

    之前在上一章Netty专题-(2)NIO三大核心中介绍了NIO的三大核心类Selector . Channel 和 Buffer,这一章我们将利用这些核心进行编程实现相关的一些功能.在正式进入编程之前 ...

  9. 你对Java网络编程了解的如何?Java BIO 网络编程 | Netty 前期知识

    一步一步走来,之前去学习了JUC并发编程知识,现在终于到Java IO网络编程啦,难啊. 一.BIO介绍 引入: 随着技术的发展,两个或以上的程序必然需要进行交互,于是提供了一种端到端的通信,相当于对 ...

  10. 四十六、深入Java的网络编程(下篇)

    @Author:Runsen @Date:2020/6/9 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

最新文章

  1. 独家 | 机器学习数据准备技术之旅(附链接)
  2. 第十六届智能车竞赛比赛进行中 - 参赛队员提出的问题
  3. Centos mysql的安装和配置
  4. 【转】小菜硬件杂谈 细数主板上曾出现过的插槽
  5. 发送json给服务器
  6. [雪峰磁针石博客]2018最佳人工智能数据采集(爬虫)工具书下载
  7. 第2章 变量和基本类型 附3---底层const和顶层const
  8. CentOS通过进程ID查询运行文件的路径方法
  9. ActiveMQ消息队列
  10. 低版本 android 软件下载,纳米盒旧版本下载-纳米盒旧版下载4.1安卓版-西西软件下载...
  11. 链栈(入栈,出栈,遍历)
  12. vue3.0版本下动态修改表格数据
  13. CentOs7和leapftp的时候遇到的一些坑
  14. Java 树形结构数据生成导出excel文件
  15. animate.css 梦幻西游动画
  16. Fresher练打字
  17. 阿里云二级域名配置-ssl证书包不安全问题记录
  18. 2020亚洲品牌500强榜单发布 ;肯德基中国门店将限时发售植物肉汉堡 | 美通企业日报...
  19. 一种非Timeline的feeds流架构
  20. qRT-PCR 注意事项

热门文章

  1. 没有磁盘计算机就无法工作,解决办法:Bios找不到硬盘的完美解决方案,请选择STATConfigur...
  2. aplay 源码分析
  3. ASM-第二章寄存器
  4. matlab怎么将程序加密,对于MATLAB M文件怎么加密
  5. matlab更改类型,matlab数据类型和转换
  6. js 视频库 Video.js
  7. 利用kaptcha生成登录验证码
  8. 测试用例的设计方法:等价类划分法
  9. 主成分与因子分析异同_主成分分析和因子分析有什么区别?
  10. Unity 模拟鼠标点击