JAVA阻塞(IO)和非阻塞(NIO)
查看这篇文章,了解更多关于Java的阻塞和非阻塞替代创建套接字的信息。
套接字使用TCP / IP传输协议,是两台主机之间的最后一块网络通信。 您通常不必处理它们,因为它们之上构建了协议,如HTTP或FTP; 但是,了解它们的工作方式非常重要。
TCP:它是一种可靠的数据传输协议,可确保发送的数据完整且正确,并且需要建立连接。Java提供了一种阻塞和非阻塞替代方法来创建套接字,并且根据您的要求,您可以考虑使用其中一个。
Java IO
Java阻塞IO API包含在Java.net包下的JDK中,通常最简单易用。
此API基于可以读取或写入的字节流和字符流。 没有可用于前后移动的索引,就像在数组中一样,它只是一个连续的数据流。
每次客户端请求连接到服务器时,它都会阻塞一个线程。 因此,如果我们希望有许多同时连接,我们必须创建足够大的线程池。
1. 使用给定端口创建ServerSocket以进行侦听。
2. 当调用accept()并开始监听客户端连接时,服务器将阻塞。
3. 如果客户端请求连接,则accept()返回一个Socket。
4. 现在,我们可以从客户端(InputStream)读取并将数据发送回客户端(OutputStream)。
如果我们想允许多个连接,我们必须创建一个线程池:
如您所见,此API有一些限制。 我们将无法接受比机器中可用线程更多的连接。 因此,如果您希望有许多连接,则需要一个替代方案。
Java NIO
Java.nio是用于套接字连接的非阻塞API,这意味着您对可用线程的数量并不紧密。 使用此库,一个线程可以同时处理多个连接。
Channel::通道是输入和输出流的组合,因此它们允许您进行读写,并且它们使用缓冲区来执行这些操作。
Buffer:它是一块内存,用于从通道读取并写入其中。 当你想从Buffer中读取数据时,需要调用flip(),以便将pos设置为0。
1. 在第1行,pos将等于写入Buffer的字节数。
2. 在第3行,调用flip()将位置设置为0并限制先前写入的字节数。
3. 在第5行,它一次从缓冲区读取一个字节到极限。
4. 最后,在第7行,我们清除缓冲区。
Selector:选择器可以注册多个通道,并检查哪些通道已准备好接受新连接。 与阻塞IO的accept()方法类似,当调用select()时,它将阻塞应用程序,直到Channel准备好进行操作。 由于Selector可以注册多个通道,因此只需要一个线程来处理多个连接。
Selection Key:它包含特定通道的属性(兴趣集,就绪集,选择器/通道和可选的附加对象)。 选择键主要用于了解通道的当前兴趣(isAcceptable(),isReadable(),isWritable()),获取通道并对该通道进行操作。
下面我们将使用Echo Socket Channel服务器来展示NIO的工作原理。
1. 从第1行到第3行,创建了ServerSocketChannel,您必须明确地将其设置为非阻塞模式。 套接字还配置为监听端口8080。
2. 在第5行和第6行,创建一个Selector,并在Selector上注册ServerSocketChannel,其中SelectionKey指向ACCEPT操作。
3. 为了使应用程序始终保持监听,阻塞方法select()位于无限while循环内,select()将在选择至少一个通道时返回,唤醒唤醒()或线程被中断。
4. 然后,在第10行,从选择器返回一组键,我们将遍历它们以执行就绪通道。
1. 每次创建新连接时,isAcceptable()都将为true,并且新的Channel将注册到Selector中。
2. 为了跟踪每个通道的数据,将它放在一个Map中,其中套接字通道作为键和ByteBuffers列表。
3. 然后,选择器将指向READ操作。
1. 在读取块中,将检索通道,并将传入的数据写入ByteBuffer。
2. 在第6行,我们检查连接是否已关闭。
3. 在第9行和第10行,缓冲区设置为flip()读取模式并添加到Map。
4. 然后,调用interestOps()以指向WRITE操作。
1. 再一次,检索通道以便将保存在Map中的数据写入其中。
2. 然后,我们将Selector设置为READ操作。
如果连接关闭,通道将从Map中删除,我们关闭通道。
Java IO Vs. NIO
IO和NIO之间的选择取决于用例。 对于更少的连接和简单的解决方案,IO可能更适合您。 然而,如果你想要能够同时处理数千个连接的更高效的东西,NIO可能是更好的选择,但请记住它会引入很多代码复杂性。 但是,有一些框架,如Netty或Apache MINA,它们构建在NIO之上,并隐藏了编程的复杂性。
如JAVA上遇到什么不懂的,可以私聊我!
JAVA阻塞(IO)和非阻塞(NIO)的更多相关文章
- 【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?
通过上篇文章([死磕NIO]- 阻塞.非阻塞.同步.异步,傻傻分不清楚),我想你应该能够区分了什么是阻塞.非阻塞.异步.非异步了,这篇文章我们来彻底弄清楚什么是阻塞IO,非阻塞IO,IO复用,信号驱动 ...
- 5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO
POSIX 同步IO.异步IO.阻塞IO.非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下. ...
- 阻塞IO和非阻塞IO的区别
转载地址: http://blog.sina.com.cn/s/blog_a46817ff0101g0gv.html http://blog.csdn.net/nodeathphoenix/artic ...
- 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO
同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...
- 转 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO
此文章为转载,如有侵权,请联系本人.转载出处,http://blog.chinaunix.net/uid-28458801-id-4464639.html 同步(synchronous) IO和异步( ...
- 简述同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别
POSIX 同步IO.异步IO.阻塞IO.非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下. ...
- 理论铺垫:阻塞IO、非阻塞IO、IO多路复用/事件驱动IO(单线程高并发原理)、异步IO
完全来自:http://www.cnblogs.com/alex3714/articles/5876749.html 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同 ...
- Python_阻塞IO、非阻塞IO、IO多路复用
0.承上 进程: 计算机里最小的资源分配单位: 数据隔离, 利用多核,数据不安全. 线程: 计算机中最小的CPU调度单位: 数据共享,GIL锁,数据不安全. 协程: 线程的一部分,是有用户来调度的; ...
- 同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别
POSIX 同步IO.异步IO.阻塞IO.非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下. ...
- 事件驱动模型 IO多路复用 阻塞IO与非阻塞IO select epool
一.事件驱动 1.要理解事件驱动和程序,就需要与非事件驱动的程序进行比较.实际上,现代的程序大多是事件驱动的,比如多线程的程序,肯定是事件驱动的.早期则存在许多非事件驱动的程序,这样的程序,在需要等待 ...
随机推荐
- mysql之innodb存储引擎---数据存储结构
一.背景 1.1文件组织架构 首先看一下mysql数据系统涉及到的文件组织架构,如下图所示: msyql文件组织架构图 从图看出: 1.日志文件:slow.log(慢日志),error.log(错误日 ...
- 玩转 SpringBoot 2 快速整合 | Thymeleaf 篇
前言 Thymeleaf是一个适用于Web和独立环境的现代服务器端Java模板引擎. Thymeleaf的主要目标是为您的开发工作流程带来优雅的自然模板 - 可以在浏览器中正确显示的HTML,也可以用 ...
- [大数据学习研究] 3. hadoop分布式环境搭建
1. Java安装与环境配置 Hadoop是基于Java的,所以首先需要安装配置好java环境.从官网下载JDK,我用的是1.8版本. 在Mac下可以在终端下使用scp命令远程拷贝到虚拟机linux中 ...
- Spring Boot 利用 nginx 实现生产环境的伪热更新
当我们在服务器部署Java程序,特别是使用了 Spring Boot 生成单一 Jar 文件部署的时候,单一文件为我们开发单来的极大的便利性,保障程序的完整性.但同时对我们修改程序中的任何一处都带来重 ...
- .Net基础篇_学习笔记_第七天_Continue关键字的用法
Continue: 立即结束本次循环,判断循环条件: 如果成立,则进行下一次循环,否则退出循环. Continue和break的区别: 遇到break,循环不继续. 遇到continue,本次循环也不 ...
- js 正则表达式:价格的校验
/*验证单价:包括两位小数*/var priceReg = /(^[1-9]\d*(\.\d{1,2})?$)|(^0(\.\d{1,2})?$)/;var price=$("#price& ...
- Spring入门(十二):Spring MVC使用讲解
1. Spring MVC介绍 提到MVC,参与过Web应用程序开发的同学都很熟悉,它是展现层(也可以理解成直接展现给用户的那一层)开发的一种架构模式,M全称是Model,指的是数据模型,V全称是Vi ...
- go 学习笔记之仅仅需要一个示例就能讲清楚什么闭包
本篇文章是 Go 语言学习笔记之函数式编程系列文章的第二篇,上一篇介绍了函数基础,这一篇文章重点介绍函数的重要应用之一: 闭包 空谈误国,实干兴邦,以具体代码示例为基础讲解什么是闭包以及为什么需要闭包 ...
- Kubernetes学习之Kubernetes架构
架构 Kubernetes历史
- [DE] How to learn Big Data
打开一瞧:50G的文件! emptystacks jobstacks jobtickets stackrequests worker 大数据加数据分析,需要以python+scikit,sql作为基础 ...