当前位置: 首页 > news >正文

NIO与BIO

当谈到 Java 网络编程时,经常会听到两个重要的概念:BIO(Blocking I/O,阻塞 I/O)和 NIO(Non-blocking I/O,非阻塞 I/O)。它们都是 Java 中用于处理 I/O 操作的不同编程模型。

一、介绍

1. BIO(Blocking I/O)

BIO 是 Java 最早的 I/O 模型,也是最简单的一种。在 BIO 模型中,每个 I/O 操作都会阻塞当前线程,直到数据准备就绪或者超时,才会继续执行下一步操作。这意味着如果有大量的并发连接,就需要创建大量的线程来处理这些连接,会造成资源浪费和性能下降。

在 BIO 模型中,通常采用的是一对一的客户端-服务器模型,即每个客户端连接都需要对应一个服务器端的线程来处理。这样的模型适用于连接数较少且连接持续时间较长的场景,但不适合高并发、短连接的场景。

2. NIO(Non-blocking I/O)

NIO 是 Java 在 JDK 1.4 引入的新的 I/O 模型,相比于 BIO,它提供了更为灵活和高效的网络编程方式。NIO 主要通过以下几个核心组件来实现非阻塞 I/O:

  • 通道(Channel):提供了全双工、非阻塞的数据传输通道,可以通过通道读取和写入数据。
  • 缓冲区(Buffer):用于在通道和应用程序之间传输数据的中介,存储读取或写入的数据。
  • 选择器(Selector):用于监听多个通道的事件,当通道发生读写事件时,可以通过选择器来选择感兴趣的事件进行处理。

NIO 模型中的关键是非阻塞通道和选择器。通过使用单线程或少量线程配合选择器,可以实现同时处理多个连接,从而提高了系统的并发处理能力。

NIO 模型适用于高并发、短连接的场景,如 Web 服务器、游戏服务器等。它的设计理念是通过少量线程处理大量并发连接,避免了线程资源的浪费和上下文切换的开销,从而提高了系统的性能和吞吐量。

"Non-blocking I/O"(非阻塞 I/O)通常也被称为 "New I/O"(新 I/O)。在 Java 中,NIO(New I/O)包提供了一套非阻塞的 I/O 操作方式,因此人们常常将其简称为 "New I/O"。这个术语可能源自于 Java 1.4 版本中引入 NIO 的时代,当时这种非阻塞 I/O 模型被认为是一种新的、先进的技术。

所以,虽然 "New I/O" 并不是一个严格意义上的术语,但在 Java 社区中,它通常被用来指代 NIO(Non-blocking I/O)相关的技术和包。

3、总结

BIO 和 NIO 是 Java 中常用的两种 I/O 模型,各有优缺点:

  • BIO 简单易懂,适用于连接数较少且连接持续时间较长的场景,但在高并发情况下性能较差。
  • NIO 提供了非阻塞、多路复用的网络编程方式,适用于高并发、短连接的场景,能够提高系统的性能和吞吐量,但编程复杂度较高。

二、Tomcat文件配置

在Tomcat的配置文件中也涉及到NIO(Non-blocking I/O,即非阻塞 I/O)与BIO(Blocking I/O,阻塞式I/O)的设置。

Tomcat 是一个流行的开源的 Java Servlet 容器,用于实现 Java Servlet 和 JavaServer Pages 技术。它支持多种 I/O 模型,包括 NIO 和 BIO。

在 Tomcat 的配置文件中,一般通过 Connector 元素配置连接器,其中的 protocol 属性用于指定使用的协议。在使用 NIO 或 BIO 时,通常会设置对应的协议,如下所示:

<!-- 使用NIO协议 -->
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"connectionTimeout="20000"redirectPort="8443" /><!-- 使用BIO协议 -->
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />

在上面的示例中,当 protocol 属性设置为 org.apache.coyote.http11.Http11NioProtocol 时,表示使用 NIO 协议;当 protocol 属性设置为 HTTP/1.1 时,表示使用 BIO 协议。

通过配置连接器的协议,可以选择不同的 I/O 模型来处理请求,以满足应用程序的性能和需求。 NIO 模型相比 BIO 模型具有更好的性能和扩展性,特别适用于高并发的场景。

三、NGINX 的配置相关

在 NGINX 的配置中,并没有像 Tomcat 那样直接涉及到具体的 I/O 模型的配置选项。NGINX 是一个高性能的 Web 服务器,它使用了事件驱动的异步架构来处理连接和请求,但是具体的事件驱动模型对用户是透明的,不需要用户手动配置。

NGINX 的事件驱动模型默认使用了 epoll(在 Linux 上)或 kqueue(在 BSD 和 macOS 上)等高性能的事件模型,以实现高并发、高吞吐量的请求处理。这些细节对于用户来说是不可见的,NGINX 会根据系统和编译时的参数自动选择最佳的事件模型,并且在大多数情况下不需要用户进行额外的配置。

因此,在 NGINX 的配置文件中,一般不需要关心具体的 I/O 模型,用户只需要关注配置 NGINX 的监听端口、虚拟主机、反向代理、负载均衡等功能即可。

四、涉及到的框架与中间件

在Java生态系统中,许多中间件和框架都涉及到了NIO(New I/O)和BIO(Blocking I/O)的使用,以实现高性能的网络通信。以下是一些常见的中间件和框架,它们可能涉及到NIO和BIO:

  1. Netty:Netty 是一个高性能的异步事件驱动的网络应用框架,它基于 NIO 实现了网络通信的高性能和可扩展性。

  2. Apache MINA:Apache MINA 是一个基于 Java 的网络应用框架,提供了可扩展的高性能的基于 NIO 的网络通信。

  3. Tomcat:Tomcat 是一个流行的 Java Servlet 容器,它在处理 HTTP 请求时可以选择使用 NIO 或 BIO,通过配置 Connector 的协议来指定。

  4. Jetty:Jetty 是另一个流行的 Java Servlet 容器和 Web 服务器,它也支持使用 NIO 或 BIO 来处理网络连接。

  5. Apache HTTP Server:Apache HTTP Server 是世界上最流行的 Web 服务器之一,它在处理 HTTP 请求时可以使用 NIO 或者传统的多线程模型。

  6. Redis:Redis 是一个内存数据库,它的网络通信层使用了 NIO 来实现高性能的异步 I/O。

  7. MySQL Connector/J:MySQL 的 Java 连接器,它可以使用 NIO 来实现异步的数据库访问。

  8. Spring Framework:Spring Framework 是一个全面的 Java 开发框架,其中的 Spring Web 模块在处理 HTTP 请求时可以选择使用 NIO 或者传统的阻塞 I/O。

这些是常见的一些中间件和框架,在网络通信方面涉及到了 NIO 和 BIO 的使用。选择适合的 I/O 模型可以根据具体的应用场景和性能需求来决定,以提高系统的性能和吞吐量。

相关文章:

NIO与BIO

当谈到 Java 网络编程时&#xff0c;经常会听到两个重要的概念&#xff1a;BIO&#xff08;Blocking I/O&#xff0c;阻塞 I/O&#xff09;和 NIO&#xff08;Non-blocking I/O&#xff0c;非阻塞 I/O&#xff09;。它们都是 Java 中用于处理 I/O 操作的不同编程模型。 一、介…...

YOLOv5实战记录05 Pyside6可视化界面

个人打卡&#xff0c;慎看。 指路大佬&#xff1a;【手把手带你实战YOLOv5-入门篇】YOLOv5 Pyside6可视化界面_哔哩哔哩_bilibili 零、虚拟环境迁移路径后pip报错解决 yolov5-master文件夹我换位置后&#xff0c;无法pip install了。解决如下&#xff1a; activate.bat中修改…...

HTML5.Canvas简介

1. Canvas.getContext getContext(“2d”)是Canvas元素的方法&#xff0c;用于获取一个用于绘制2D图形的绘图上下文对象。在给定的代码中&#xff0c;首先通过getElementById方法获取id为"myCanvas"的Canvas元素&#xff0c;然后使用getContext(“2d”)方法获取该Ca…...

excel统计分析——多项式回归

参考资料&#xff1a;生物统计学 多项式回归属于单变量曲线回归&#xff0c;但其形式和求解方法与多元线性回归相似。多项式回归的数学模型为&#xff1a; 令&#xff0c;&#xff0c;&#xff0c;&#xff0c;则 由于X不可逆&#xff0c;两边同时乘以X得&#xff0c;&#xff…...

SQLyog连接数据库8.0版本解析错误问题解决方案

问题描述&#xff1a; 解决方案&#xff1a; alter userrootlocalhostidentified with mysql_native_password by 密码; 再次连接就可以了。...

【数据库】SQL简介

SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种用于管理关系型数据库管理系统&#xff08;RDBMS&#xff09;的标准化语言。它用于访问和操作数据库中的数据&#xff0c;执行各种任务&#xff0c;如插入、更新、删除和检索数据&#x…...

AWS入门实践-利用S3构建一个静态网站

使用Amazon S3托管静态网站是一个流行的选择&#xff0c;因为它简单、成本效益高&#xff0c;并且易于维护。静态网站由不含服务器端脚本的文件组成&#xff0c;如HTML、CSS和JavaScript文件。下面是使用S3托管静态网站的操作步骤&#xff1a; 如果大家没有AWS免费账号&#x…...

使用Linux strace追踪系统调用: 一个详细指南

使用Linux strace追踪系统调用: 一个详细指南 Linux strace是一个强大的命令行工具&#xff0c;用于监视和调试进程中发生的系统调用和信号。它对于系统管理员和开发人员来说是理解程序行为和解决问题的重要工具。 什么是strace&#xff1f; strace是一种跟踪运行中的进程执…...

python 笔记

文章目录 pdbpdb开始调试pythonpdb设置断点单步执行进入到函数的内部执行到下一个断点或程序结束调用栈查看命令查看当前函数调用堆栈向上一层函数查看调用堆栈查看源代码 importimport 用法 numpy导入numpy模块numpy常用函数np.argmaxnp.sum range生成连续序列生成不连续序列 …...

软考 系统架构设计师系列知识点之数据库基本概念(4)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之数据库基本概念&#xff08;3&#xff09; 所属章节&#xff1a; 第6章. 数据库设计基础知识 第1节 数据库基本概念 6.1.3 数据库管理系统 DBMS&#xff08;DataBase Management System&#xff0c;数据库管理系统&am…...

Vue - 3( 15000 字 Vue 入门级教程)

一&#xff1a;初识 Vue 1.1 收集表单数据 收集表单数据在Vue.js中是一个常见且重要的任务&#xff0c;它使得前端交互变得更加灵活和直观。 Vue中&#xff0c;我们通常使用v-model指令来实现表单元素与数据之间的双向绑定&#xff0c;从而实现数据的收集和更新。下面总结了…...

上位机图像处理和嵌入式模块部署(qmacvisual图像清晰度)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 做过isp的同学都知道&#xff0c;图像处理里面有一个3A&#xff0c;即自动曝光、自动白平衡和自动对焦。其中自动对焦这个&#xff0c;就需要用输入…...

数据结构和算法:分治

分治算法 分治&#xff08;divide and conquer&#xff09;&#xff0c;全称分而治之&#xff0c;是一种非常重要且常见的算法策略。分治通常基于递归实现&#xff0c;包括“分”和“治”两个步骤。 1.分&#xff08;划分阶段&#xff09;&#xff1a;递归地将原问题分解为两个…...

增强Java技能:使用OkHttp下载www.dianping.com信息

在这篇技术文章中&#xff0c;我们将探讨如何使用Java和OkHttp库来下载并解析www.dianping.com上的商家信息。我们的目标是获取商家名称、价格、评分和评论&#xff0c;并将这些数据存储到CSV文件中。此外&#xff0c;我们将使用爬虫代理来绕过任何潜在的IP限制&#xff0c;并实…...

用友 NC saveXmlToFIleServlet 任意文件上传漏洞复现

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等,帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友 NC saveXmlToFIleServlet接口处存在…...

JS第九天

今天是第九天&#xff0c;学习了JS中的设置日期和倒计时&#xff0c;计时器以及验证码倒计时&#xff0c;那么话不多说我们开始今天的学习吧 一、日期设置 1.1日期创建 调用 new Date() 来创建一个新的 Date 对象。在调用时可以带有一些参数&#xff0c;创建一个 Date 对象&…...

CSS设置字体样式

目录 前言&#xff1a; 1.font-family&#xff1a; 2.font-style&#xff1a; 3.font-weight&#xff1a; 4.font-size&#xff1a; 5.font-variant&#xff1a; 6.font&#xff1a; 前言&#xff1a; 在网页中字体是重要的组成部分&#xff0c;使用好字体可以让网页更…...

[Java线程池]ExecutorService|CompletionService的区别与选择

这段时间对业务系统做了个性能测试&#xff0c;其中使用了较多线程池的技术&#xff0c;故此做一个技术总结。 这次总结的内容比较多&#xff0c;主要是四个&#xff1a; ExecutorServiceCompletionServiceRunnableCallable 前两个是线程池相关接口&#xff0c;后两个是多线…...

MySQL-SQL编写练习:基本的SELECT语句

基本的SELECT语句 1. SQL的分类 DDL:数据定义语言。CREATE \ ALTER \ DROP \ RENAME \ TRUNCATEDML:数据操作语言。INSERT \ DELETE \ UPDATE \ SELECT &#xff08;重中之重&#xff09;DCL:数据控制语言。COMMIT \ ROLLBACK \ SAVEPOINT \ GRANT \ REVOKE 学习技巧&#xf…...

C++经典面试题目(十九)

1、什么是析构函数&#xff1f;它有什么作用&#xff1f; 析构函数是类的特殊成员函数&#xff0c;用于在对象被销毁时执行清理工作。它的名称与类名相同&#xff0c;前面加上波浪号&#xff08;~&#xff09;。析构函数的作用在于确保在对象被销毁时释放占用的资源&#xff0…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...