NIO网络通信

阻塞式IO与非阻塞式IO

传统的IO流都是阻塞式的。也就是说,当一个线程调用read() 或write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务。因此,在完成网络通信进行IO操作时,由于线程会阻塞,所以服务器端必须为每个客户端都提供一个独立的线程进行处理,当服务器端需要处理大量客户端时,性能急剧下降。

Java NIO是非阻塞模式的。当线程从某通道进行读写数据时,若没有数据可用时,该线程可以进行其他任务。线程通常将非阻塞IO的空闲时间用于在其他通道上执行I0操作,所以单独的线程可以管理多个输入和输出通道。因此,NIO可以让服务器端使用一个或有限几个线程来同时处理连接到服务器端的所有客户端。

mark

选择器和通道的关系:通道注册到选择器上,选择器监控通道。当某一个通道上,某一个事件准备就绪时,那么选择器才会将这个通道分配到服务器端一个或多个线程上,再继续运行。比如说当客户端发送一些数据给服务器端,只有当客户端的所有数据都准备就绪时,选择器才会将这个注册的通道分配到服务器端的一个或者多个线程上。如果客户端的线程没有将数据准备就绪时,服务器端的线程可以执行其他任务,就不会阻塞在那里。

原先的传统的阻塞IO模式,相当于你没有手机去等快递,算准了EMS每天中午13:00会到你们公司门口,所以你12:50在那里等着他们来,在这10分钟里你被这件事情阻塞着,什么事情都做不了,真是浪费时间;而NIO的这种通道注册选择器,选择器监控通道,等到数据准备就绪才会占用服务器线程的非阻塞IO方式,更像是带着手机等外卖,我在饿了么注册了一个用户(通道在选择器上注册了),然后定完外卖就忙自己的去了,等到外卖送来之后我接到电话下去取就可以了。如果你学习过Linux内核的epoll多路复用模型,这一点应该不难理解,无非就是IO事件就绪通知!

选择器 Selector

选择器( Selector) 是 SelectableChannle 对象的多路复用器, Selector 可以同时监控多个 SelectableChannel 的 IO 状况,也就是说,利用 Selector可使一个单独的线程管理多个 Channel。 Selector 是非阻塞 IO 的核心。

SelectableChannle 的结构如下图(注意:FileChannel不是可作为选择器复用的通道!FileChannel不能注册到选择器Selector!FileChannel不能切换到非阻塞模式!FileChannel不是SelectableChannel的子类!)

mark

当调用 register(Selector sel, int ops) 将通道注册选择器时,选择器对通道的监听事件,需要通过第二个参数 ops 指定,可以监听的事件类型,可使用 SelectionKey 的四个常量表示:

mark

若注册时不止监听一个事件,则可以使用位或操作符连接

mark

SelectionKey: 表示 SelectableChannel 和 Selector 之间的注册关系。每次向选择器注册通道时就会选择一个事件(选择键)。 选择键包含两个表示为整数值的操作集。操作集的每一位都表示该键的通道所支持的一类可选择操作。

mark

Selector的常用API

mark

阻塞式IO示例

阻塞式网络通信

mark

有反馈的阻塞式通信

mark

非阻塞式IO示例

非阻塞式通信,其实与epoll的编程模式很像

mark

上面的功能类似于一个群聊,由于IDEA不支持junit控制台,所以我直接拿eclipse试了一下

UDP使用NIO

其实和上面的示例没啥区别, UDP非阻塞网络,NIO中信息的接收端和发送端都是直接用DatagramChannel的open方法生成一个数据报通道,发送的时候指明地址和端口;接收的一方需要先bind一个端口号,监听着。接收方可能监听到多个发送端向其发送数据,为了单个线程能够处理多个客户端发送的数据,并且在发送的过程中不被某个发送端全程阻塞,同样需要用到选择器。

使用选择器仍然需要将通道注册到选择器上,并指明需要监听的事件,即选择键。

mark

一旦向Selector注册了一或多个通道,就可以调用几个重载的select()方法。这些方法返回你所感兴趣的事件(如连接、接受、读或写)已经准备就绪的那些通道。换句话说,如果你对”读就绪”的通道感兴趣,select()方法会返回读事件已经就绪的那些通道。

  • int select():阻塞到至少有一个通道在你注册的事件上就绪了
  • int select(long timeout):select(long timeout)和select()一样,除了最长会阻塞timeout毫秒(参数)
  • int selectNow():selectNow()不会阻塞,不管什么通道就绪都立刻返回,此方法执行非阻塞的选择操作。如果自从前一次选择操作后,没有通道变成可选择的,则此方法直接返回零。

管道 Pipe

Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取

mark

通过一个管道,在发送数据的源头线程内获取SinkChannel,将数据写入缓冲区,缓冲区切换成读模式,写入SinkChannel;通过该管道在接收数据的线程内获取SourceChannel,然后从SourceChannel读取数据放到缓冲区,然后切换缓冲区为读模式,将数据取出。

mark

NIO2中的几个实用类

随着 JDK 7 的发布, Java对NIO进行了极大的扩展,增强了对文件处理和文件系统特性的支持,以至于我们称他们为 NIO.2。因为 NIO 提供的一些功能, NIO已经成为文件处理中越来越重要的部分。

java.nio.file.Path 接口代表一个平台无关的平台路径,描述了目录结构中文件的位置。

mark

java.nio.file.Files 用于操作文件或目录的工具类。

mark

mark

参考资料

http://tutorials.jenkov.com/java-nio/index.html

http://hg.openjdk.java.net/jdk/jdk/file/d8327f838b88/src/java.base/linux/classes/sun/nio/ch/EPollSelectorImpl.java

  • 本文作者: Tim
  • 本文链接: https://zouchanglin.cn/2020/02/09/3232140802.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明出处!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1549785.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

自动驾驶仿真:Carsim、NI和VTD联合仿真课题二

文章目录 前言一、设备配置1、硬件需求1.1 电脑一(Linux系统)1.2 电脑二(Window系统)1.3 NI实时机系统 2、网络配置2.1 IP设置 二、Carsim工程配置1、创建工程1.1 复制NI的模板,创建新工程 2、创建数据库2.1 复制数据库…

【关于NI CAN USB-8473在实际应用中的案例分析】

【NI CAN USB-8473在实际应用中的案例分析】 NI CAN USB-8473是国际上比较先进的一种控制器区域网络(Controller Area Network,CAN)总线适配器,可实现多个CAN总线与PC的连接。这种适配器的出现,在许多工业控制领域中得…

【python】pyvisa运用——NI-VISA安装和TCP/IP设备配置

文章目录 安装NI-VISA打开NI MAX新建TCPIPpyvisa验证设备连接 安装NI-VISA 安装前关闭杀毒软件,双击NI-VISA runtime17.0后 下载地址:https://download.csdn.net/download/xiakejiqiren/85110993 点击确定 默认安装路径即可,点击unzip&a…

⽹络中的网络(NIN)

《动手学深度学习pytorch》部分学习笔记,仅用作自己复习。 网络中的网络(NIN) 前几节介绍的LeNet、AlexNet和VGG在设计上的共同之处是:先以由卷积层构成的模块充分抽取空间特征,再以由全连接层构成的模块来输出分类结…

机器学习理论与实战(十二)神经网络

神经网络又火了,因为深度学习火了,所以必须增加个传统神经网络的介绍,尤其是back propagation算法。很简单,俺也就不舞文弄墨的说复杂咯,神经网络模型如(图一)所示: (图一) (图一)中的神经网络模型是由多个感知器(perceptron)分几层组合而成,所谓感知器就是单层的…

打通NI LabVIEW与飞桨工具链,百度携手NI探索工业硬科技新方向

小到一部手机、大到一辆汽车,地上的网络通信、天上的卫星,所有的高科技产品从设计到生产使用的每个环节,都需要进行复杂的测试与验证。因此,自动化测试测量以及对数据的分析能力和效率不仅推动着科技的革新,也具有巨大…

NI9185与NI9234硬件在NI MAX中的设置

NI CDAQ-9185是一款四槽机箱,通过TCP协议(网线)与电脑相连。NI 9234是声振采集卡,4通道。用来测量来自集成电子压电(IEPE)和非IEPE传感器信号,例如振动传感器(加速度计)&…

计算机系统:网络编程

所有的网络应用都是基于相同的基本编程模型(客户端-服务器编程模型),有着相似的整体逻辑结构,并且依赖相同的编程接口。 客户端-服务器编程模型 每个网络应用都是基于客户端-服务器模型的。采用这个模型,一个应用是由一…

NoC片上网络

片上网络: 一般采用2D mesh拓扑,其核心为路由算法/流控机制,路由一般使用固定XY或虫孔算法, 目前比较好的NoC开源参考工程为:LisNoC http://www.lisnoc.org/flowcontrol.html ARM官方也有一些NoC应用: …

LabVIEW中MAX在我的网络上不显示“远程系统”选项卡或设备

LabVIEW中MAX在我的网络上不显示“远程系统”选项卡或设备 无法在NI MAX中看到“远程系统”选项卡。 无法在NI MAX的“远程系统”选项卡下看到我的设备。 解决方案 如果设备是实时操作系统,则设备只会显示在NIMeasurement&Automation Explorer&#xff0…

网络中的网络:NiN

前面几篇文章介绍的LeNet、AlexNet和VGG在设计上的共同之处是:先以由卷积层构成的模块充分抽取空间特征,再以由全连接层构成的模块来输出分类结果。其中,AlexNet和VGG对LeNet的改进主要在于如 何对这两个模块加宽(增加通道数&…

LabVIEW网络服务器何使用,有哪些不同

LabVIEW网络服务器何使用,有哪些不同 NI有几款不同的Web服务器,可使用不同的产品并覆盖不同的用例。它们具有非常相似的名称,可以互换使用,但每个都提供不同的功能。 应用程序Web服务器 描述:NI应用Web服务器加载使用L…

LabVIEW NI网络设备在MAX中不显示或未识别

LabVIEW NI网络设备在MAX中不显示或未识别 有一个NI设备通过网络连接到主机。发生以下情况之一: 尝试在Measurement&AutomationExplorer(MAX)中配置设备。设备未显示在“远程系统”下。 NIMAX中未检测到CompactRIO(cRI…

站点平台技术架构

系统架构部署思维导图 一、前期工作 1.系统保持一致性方案: GIT版本控制:通过总控端向租户端发送一个更新同步请求,租户端收到请求后执行GIT PULL 命令,执行完成命令后会进行获取当前版本指定的SQL文件,进行同步更新…

选购Redshift工作站需要注意哪些方面?

GPU 渲染在过去几年中变得非常流行。这并不奇怪,这要归功于 GPU 功能的巨大进步。专为 Redshift 等 GPU 加速渲染引擎量身定制的经过良好优化的工作站可以实时生成高度详细的渲染。 Maxon Redshift 与许多行业领先的 3D 设计应用程序完美集成,使其成为建…

华为mate x2什么时候更新鸿蒙系统,华为Mate X2真机发布,今年四月可升级鸿蒙系统...

沉寂许久的华为终于迎来新的动作,新一代折叠屏旗舰机Mate X2于2月22日晚上正式发布。有人即使不在江湖,暂时退场,当他回归时,江湖依然会有人翘首以盼,等待着他带来新的震撼。 华为折叠屏新机Mate X2发布的消息一经传出…

华为matexs什么时候可以升级鸿蒙,华为 Mate X2 真机发布,今年四月可升级鸿蒙系统...

沉寂许久的华为终于迎来新的动作,新一代折叠屏旗舰机 Mate X2 于 2 月 22 日晚上正式发布。有人即使不在江湖,暂时退场,当他回归时,江湖依然会有人翘首以盼,等待着他带来新的震撼。 华为折叠屏新机 Mate X2 发布的消息…

华为Mate X2售价17999元起,Mate X2将首批省级鸿蒙系统

昨日晚间,华为正式发布新一代折叠屏手机Mate X2,搭载麒麟9000芯片,其256GB版售价17999元,512GB版售价18999元,万元的价格!一个字‘贵’ 核心规格方面,华为Mate X2搭载5nm制程工艺的麒麟9000 5G …

Docker部署MongoDB 5.0.5

1、查看目录 rootwielun:~# tree mongo mongo ├── conf │ └── mongod.conf ├── data ├── docker-compose.yml └── logrootwielun:~# cd mongo rootwielun:~/mongo# chmod 777 log2、配置docker-compose.yml rootwielun:~/mongo# cat docker-compose.yml ve…

科技资讯|荷兰电动自行车丢失将被拒保,苹果Find My可以减少丢失

荷兰最大的自行车协会荷兰皇家旅游俱乐部宣布,将不再为胖胎电动自行车提供保险,因为这种自行车的被盗风险极高。 随着电动自行车的销量飙升,胖胎也变得更受欢迎。但问题是,胖胎电动自行车也成为了自行车盗窃者的首选目标。ANWB …