1.java IO模型(BIO,NIO,AIO)

【README】

本文介绍了 3种 java io模型,包括 BIO,NIO, AIO;

IO模型名称

描述

工作原理

BIO-Blocking IO

同步并阻塞式IO

一个服务器线程处理一个客户端连接

NIO-Non-blocking IO

同步非阻塞式IO

一个服务器线程处理多个客户端连接,使用io多路复用(选择器);

AIO-Asynchronous IO

异步非阻塞式IO


【1】应用场景

  • 1)BIO方式:适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序简单易理解。
  • 2)NIO方式:适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,弹幕系统,服务器间通讯等。编程比较复杂,JDK1.4开始支持。 (Netty是基于NIO的)
  • 3) AIO方式:适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。(不常用)

【1.1】BIO代码实现

1)服务端:

/*** @Description 阻塞式IO服务器* @author xiao tang* @version 1.0.0* @createTime 2022年08月13日*/
public class BIOServer {public static void main(String[] args) throws IOException {// 创建一个线程池ExecutorService threadPool = Executors.newCachedThreadPool();int order = 0;// 创建 服务器 套接字ServerSocket serverSocket = new ServerSocket(6666);System.out.println("服务器启动成功.");while(true) {System.out.println("等待客户端请求");Socket socket = serverSocket.accept(); // 没有客户端请求,accept阻塞System.out.printf("客户端[%d]请求建立连接\n", ++order);final int orderCopy = order;threadPool.execute(()->{handler(socket, orderCopy);});}}/*** @description 与客户端通讯* @param socket 连接套接字* @author xiao tang* @date 2022/8/13*/public static void handler(Socket socket, int order) {byte[] byteArr = new byte[1024];try {// 读取客户端发送的数据InputStream inputStream = socket.getInputStream();int length = 0;// 客户端没有数据,read阻塞
//            while( ( length = inputStream.read(byteArr))!= -1) {
//                System.out.println(new String(byteArr, 0, length));
//            }while(true) {System.out.printf("线程id[%s],等待客户端[%d]发送数据\n", Thread.currentThread().getId(), order);length = inputStream.read(byteArr);if (length == -1) break;System.out.printf("线程id[%s],客户端[%d]:" + new String(byteArr, 0, length) + "\n",  Thread.currentThread().getId(), order);}} catch (IOException e) {e.printStackTrace();} finally {// 关闭与客户端的连接try {socket.close();System.out.printf("关闭与客户端[%d]的连接\n", order);} catch (IOException e) {}}}
}

2)客户端 :采用 win10的命令行 telnet 进程;

  • 命令行录入  telnet 127.0.0.1 6666
  • 录入 ctrl + ] 进入telnet命令行界面
  • send hello100 就把hello100 发送给服务器

发送过程如下:

 【小结】

  • 显然,在BIO-阻塞式IO模式下,服务器的一个线程处理一个客户端请求;且存在阻塞情况,在客户端数量过多的情况下,性能不高(因为客户端一直挂起,则过多的服务器线程会一直阻塞,浪费大量cpu和内存资源
  • serverSocket.accept() 在没有客户端请求时,会阻塞
  • inputStream.read(...) 在客户端没有发送数据时,会阻塞

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle入门(十四D)之常规函数

一、NULL处理 (1)函数的计算过程 到目前为止,您已经学会了在简单语句中应用单行函数。不过,函数可以嵌套任意层。所以,了解嵌套函数的计算过程非常重要。下例就是一个嵌套函数。其计算过程是从最里层开始计算&#xff…

python定义函数prime判断是否是素数_用自定义函数判断素数 用C语言编写自定义函数prime(int x),判断x是否为素数?...

用C语言编写自定义函数prime(int x),判断x是否为素数?int prime(int x){int i,kk(int)sqrt( (double)x )for(i2i&ltki )if(x%i0)break// 如果完成所有循环,那么x为素数if(i&gtk)retrun 1elsereturn 0}C语言,编…

构建高性能.NET应用之配置高可用IIS服务器-第一篇:IIS必须掌握的知识

正确而合理的配置IIS是构建一个高性能和高可扩展应用的基础。虽然很多的时候采用默认的配置就已经可以处理一般的情况,但是随着站点应用的发展,特别是当访问量稍微大一点的时候,就会暴露出很多我们认为的“奇奇怪怪”的问题。 所以&#xff0…

3.NIO选择器(基于NIO的服务器与客户端通讯)

【README】 本文总结自B站《尚硅谷netty》,很不错; 【1】选择器Selector(多路复用器) 【1.1】基本介绍 1)Java 的 NIO,用非阻塞的 IO 方式。可以用一个线程,处理多个客户端连接,就…

perplexity 衡量指标_求通俗解释NLP里的perplexity是什么?

高赞回答讲得已经非常通俗易懂,不过由于自然语言处理的发展,出现了许多不同类型的模型,对困惑度这个指标的计算方法颇有不同(包括前面的高赞回答也只是展开了一个子集),常常让人摸不着头脑。所以这个回答旨在尽量全面地梳理不同语…

C#在Linux上的开发指南

本人才疏学浅,在此记录自己用C#在Linux上开发的一点经验,写下这篇指南。(给想要在Linux上开发C#程序的朋友提供建议) 目前在Linux上跑的网站:http://douxiubar.com | http://douxiubar.com/AdminLogin/Index&#xff0…

Oracle入门(十四E)之条件表达式case和deocde函数

一、表达式(1)条件表达式 共有两种条件表达式,即 CASE 表达式和DECODE 表达式。就 CASE 比较两个表达式而言,该表达式在逻辑上等效于之前学习的NULLIF 函数。如果两个表达式相等,则返回null,如果不相等&…

4.基于NIO的群聊系统

【README】 1.本文总结自B站《netty-尚硅谷》,很不错; 2.文末有错误及解决方法; 【1】群聊需求 1)编写一个 NIO 群聊系统,实现服务器端和客户端之间的数据简单通讯(非 阻塞) 2)实…

构建高性能.NET应用之配置高可用IIS服务器-第二篇 IIS请求处理模型

在IIS 中,Http监听者(http.sys)和请求处理者由两个系统服务在控制着。一个是WWW 服务,另外一个就是Windows Process Activation。 对于WWW服务,它主要是监控IIS的配置文件,将新的配置信息用到HTTP.sys和WAS上。同时它也维持一些性…

Oracle入门(十四F)之PL/SQL定义变量

一、变量介绍 (1)变量的使用可以使用变量: 临时存储数据存储值的操作可重用性(2)PL/SQL中的变量处理变量是: 在声明部分中声明和初始化在可执行部分中使用和分配新值变量可以是:作为…

小米手环nfc门卡摸拟成功后不能开门_如何使用小米手环5 NFC版进行门卡模拟(如公司门禁卡、小区门禁卡、学校门禁卡等)?...

由于本人最近购入了小米手环5 NFC版,所以对小米手环模拟门禁卡比较清楚一点。说一下用该手环模拟门禁的方法吧,我本人模拟的是学校公寓的门禁卡,不过学校的门禁卡是加密卡,可能操作起来稍微比不加密的门禁卡麻烦一点,因…

5.NIO零拷贝与传统IO的文件传输性能比较

【README】 1.本文总结自B站《netty-尚硅谷》,很不错; 2.本文部分内容参考自 NIO效率高的原理之零拷贝与直接内存映射 - 腾讯云开发者社区-腾讯云 【1】零拷贝原理 【1.1】传统IO的文件拷贝 【图解】 step1)调用 sys_read系统调用&#…

二进制漏洞利用与挖掘_二进制各种漏洞原理实战分析总结

本部分将对常见的二进制漏洞做系统分析,方便在漏洞挖掘过程中定位识别是什么类型漏洞,工欲善其事,必先利其器。0x01栈溢出漏洞原理栈溢出漏洞属于缓冲区漏洞的一种,实例如下:编译后使用windbg运行直接运行到了地址0x41…

Oracle入门(十四H)之良好的编程实践

一、为什么要学习它 好的编程实践是技巧,可以按照创建最好的代码可能。 编程实践涵盖了一切从代码更多可以用更快的速度创建代码性能。 软件工程团队通常会遵循风格指导让团队中的每个人使用相同的技术。 这使它更容易阅读和修改编写的代码其他。二、编程实践已经学…

微软.NET 正式劈腿成功,横跨所有平台

.NET官方博客宣布了《Announcing .NET Core RC2 and .NET Core SDK Preview 1》,正式如期发布了.NET Core RC2, 现在可以放心的基于.NET Core 构建 ASP.NET Core, console apps 和 class libraries for Windows, OS X and Linux。这里贴张图表达下他们之间的关系: …

2.BIO与NIO区别

【README】 1.本文总结自B站《netty-尚硅谷》,很不错;2.本文介绍 BIO, NIO的知识;【1】BIO(传统java IO模型) 1)BIO-Blocking IO:同步阻塞,服务器实现模式为一个连接一…

k8s往secret里导入证书_K8S之Secret

简介secret顾名思义,用于存储一些敏感的需要加密的数据。这些数据可能是要保存在pod的定义文件或者docker的镜像中。把这些数据通过加密的方式存放到secrets对象中,可以降低信息泄露的风险。在secret中存储的数据都需要通过base64进行转换加密后存放。创…

Oracle入门(十四G)之PL / SQL中检索数据

一、PL / SQL中检索数据 (1)PL / SQL中的SQL语句可以在PL / SQL中使用以下几种SQL语句:•SELECT从数据库检索数据。•DML语句,例如INSERT,UPDATE和DELETE,以更改数据库中的行。•事务控制语句,例…

.NET Core 1.0 CentOS7 尝试

昨天宣布 ASP.NET Core RC2,据说差不多稳定了,以后不会有大改了。 参考:https://blogs.msdn.microsoft.com/webdev/2016/05/16/announcing-asp-net-core-rc2/ 一、环境装备 等待很久了,高兴之余昨晚安装一个CentOS系统,版本如下&a…

6.netty线程模型-Reactor

【README】 1..本文部分内容翻译自: [Netty] Nettys thread model and simple usage 2.netty模型是以 Reactor模式为基础的,具体的,netty使用的是 主从Reactor多线程模型; 3.先介绍了 Reactor线程模型;后介绍了 Ne…