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

Netty——BIO、NIO 与 Netty

文章目录

  • 1. 介绍
    • 1.1 BIO
      • 1.1.1 概念
      • 1.1.2 工作原理
      • 1.1.3 优缺点
    • 1.2 NIO
      • 1.2.1 概念
      • 1.2.2 工作原理
      • 1.2.3 优缺点
    • 1.3 Netty
      • 1.3.1 概念
      • 1.3.2 工作原理
      • 1.3.3 优点
  • 2. Netty 与 Java NIO 的区别
    • 2.1 抽象层次
    • 2.2 API 易用性
    • 2.3 性能优化
    • 2.4 功能扩展性
    • 2.5 线程模型
    • 2.6 适用场景
  • 3. 总结


1. 介绍

1.1 BIO

1.1.1 概念

BIO(Blocking I/O),即 阻塞式 I/O,是 Java 最早提供的 I/O 模型。在这种模型下,当进行 I/O 操作时,线程会被阻塞,直到操作完成

1.1.2 工作原理

BIO 的服务器通常 使用一个独立的线程来处理每个客户端连接。当有新的客户端连接请求时,服务器会 为该连接创建一个新的线程,该线程负责 处理该客户端的所有 I/O 操作
BIO 模型

1.1.3 优缺点

  • 优点:编程模型简单,易于理解和实现。
  • 缺点每个客户端连接都需要一个独立的线程来处理,当客户端数量较多时,会消耗大量的系统资源,导致性能下降,可扩展性较差。

1.2 NIO

1.2.1 概念

NIO(Non-blocking I/O),即 非阻塞式 I/O,是 Java 1.4 引入的新 I/O 模型。在 NIO 中,线程在进行 I/O 操作时不会被阻塞,可以继续执行其他任务。NIO 通过 通道 (Channel)缓冲区 (Buffer) 来进行数据的读写操作,使用 选择器 (Selector) 来实现 I/O 多路复用。

1.2.2 工作原理

NIO 使用 Selector 来监控多个 Channel 的 I/O 事件,当某个 Channel 上有事件发生 时(如 可读可写),Selector 会通知相应的线程进行处理。这样,一个线程可以同时处理多个 Channel 的 I/O 操作,提高了系统的并发处理能力。
NIO 模型

1.2.3 优缺点

  • 优点使用 I/O 多路复用,一个线程可以处理多个连接,减少了线程的创建和切换开销,提高了系统的并发处理能力和资源利用率
  • 缺点:编程模型相对复杂,需要熟悉 SelectorChannelBuffer 等概念。

1.3 Netty

1.3.1 概念

Netty 是一个基于 Java NIO 构建的 高性能异步事件驱动网络应用框架。它简化了基于 TCP/UDP 的网络编程,提供了对复杂 I/O 操作(如 HTTP、WebSocket 等协议)的抽象,并内置了 高效的线程模型内存管理机制。主要用于 快速开发可维护的高性能 服务器 和 客户端

1.3.2 工作原理

Netty 基于 NIO 构建,采用了 事件驱动异步编程模型

它使用 EventLoopGroup 来管理线程,EventLoop 负责处理 Channel 上的 I/O 事件。ChannelPipeline 用于管理 ChannelHandlerChannelHandler 负责处理具体的业务逻辑。

EventLoopGroup 分为两种,一种是 BossGroup,用于处理 建立连接事件;另一种是 WorkerGroup,用于处理 读/写事件

1.3.3 优点

  • 提供了简单易用的 API,降低了开发难度。
  • 对 NIO 进行了优化,性能更高。
  • 具有丰富的功能特性,如 心跳检测断线重连编解码框架 等。
  • 支持多种传输协议,可扩展性强。

2. Netty 与 Java NIO 的区别

2.1 抽象层次

  • Java NIO:提供 基础的非阻塞 I/O 编程模型SelectorChannelBuffer),但需要开发者自行管理复杂的 多线程连接状态数据编解码异常处理
  • Netty:在 NIO 的基础上提供更高层次的抽象,封装了底层细节(如 线程池连接池内存管理)。开发者只需关注业务逻辑,通过 ChannelHandler 处理事件(如 连接建立数据读写)即可。

2.2 API 易用性

  • Java NIO
    • 需要手动管理 SelectorChannelBuffer 的注册与监听
    • 需处理边界问题(如 TCP 粘包/拆包)
    • 代码复杂度高,容易出错(如资源泄漏)。
  • Netty
    • 提供链式 PipelineChannelHandler 机制,简化事件处理
    • 内置工具类(如 ByteToMessageDecoder)解决粘包/拆包
    • 自动释放资源,减少内存泄漏风险。

2.3 性能优化

  • Java NIO
    • 原生的 Selector 实现在 高并发 下可能存在 空轮询 bug
    • ByteBuffer 的固定大小和内存拷贝可能影响性能。
  • Netty
    • 使用 Epoll (Linux) 或 KQueue (Mac) 等系统级高性能 I/O 模型
    • ByteBuf 支持 内存池化 (PooledByteBuf)零拷贝 (CompositeByteBuf)减少 GC 压力
    • 主从 Reactor 线程模型(BossGroup + WorkerGroup)提升并发处理能力

2.4 功能扩展性

  • Java NIO
    • 需要 自行实现协议 支持(如 HTTP)、SSL 加密等。
    • 缺乏对异步编程的友好支持。
  • Netty
    • 内置丰富的编解码器(如 HTTP、WebSocket)。
    • 支持通过 ChannelFuture 实现异步回调

2.5 线程模型

  • Java NIO
    • 开发者需 自行设计线程池 管理 I/O 事件业务逻辑
    • 容易因线程竞争导致性能下降。
  • Netty:支持 自定义线程模型,如:
    • 单线程模型:整个 Netty 服务端仅用一个线程来处理所有的 连接、读写 操作。适用于 并发量较低、业务逻辑简单 的场景。
    • 多线程 Reactor 模式默认采用):BossGroup 负责处理连接,WorkerGroup 处理 I/O

2.6 适用场景

  • Java NIO:适合 简单、小规模非阻塞 I/O 应用,或 需要完全控制底层细节 的场景。
  • Netty:适用于 高并发、低延迟复杂网络应用,如:
    • 分布式 RPC 框架(如 Dubbo)。
    • 实时通信系统(如 WebSocket 服务器)。

3. 总结

  • BIO 是传统的 阻塞式 I/O一个线程只能监听一个客户端的 I/O 事件,而且 读写操作会阻塞,不适合大量客户端的场景。
  • NIO 是 非阻塞 I/O一个线程可以监听多个通道的 I/O 事件读写操作不会阻塞,性能更高。
  • Netty 对 NIO 进行了封装,通过 内存池化零拷贝 优化了 NIO 的性能,提供了更多的高级特性,如心跳检测、断线重连。如果想要 快速构建稳定、高性能的网络应用,Netty 是更优选择。

相关文章:

Netty——BIO、NIO 与 Netty

文章目录 1. 介绍1.1 BIO1.1.1 概念1.1.2 工作原理1.1.3 优缺点 1.2 NIO1.2.1 概念1.2.2 工作原理1.2.3 优缺点 1.3 Netty1.3.1 概念1.3.2 工作原理1.3.3 优点 2. Netty 与 Java NIO 的区别2.1 抽象层次2.2 API 易用性2.3 性能优化2.4 功能扩展性2.5 线程模型2.6 适用场景 3. 总…...

【Linux】信号:信号保存和处理

🔥个人主页:Quitecoder 🔥专栏:linux笔记仓 目录 01.阻塞信号信号集 02.捕捉信号sigaction可重入函数volatileSIGCHLD 01.阻塞信号 实际执行信号的处理动作称为信号递达:每个信号都有一个默认行为,例如终…...

应用权限组列表

文章目录 使用须知位置相机麦克风通讯录日历运动数据身体传感器图片和视频音乐和音频跨应用关联设备发现和连接剪切板文件夹文件(deprecated) 使用须知 在申请目标权限前,建议开发者先阅读应用权限管控概述-权限组和子权限,了解相关概念,再合…...

MATLAB实现基于“蚁群算法”的AMR路径规划

目录 1 问题描述 2 算法理论 3 求解步骤 4 运行结果 5 代码部分 1 问题描述 移动机器人路径规划是机器人学的一个重要研究领域。它要求机器人依据某个或某些优化原则 (如最小能量消耗,最短行走路线,最短行走时间等),在其工作空间中找到一…...

【深度学习】多目标融合算法(五):定制门控网络CGC(Customized Gate Control)

目录 一、引言 二、CGC(Customized Gate Control,定制门控网络) 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场景与建模 2.3.2 模型代码实现 2.3.3 模型训练与推理测试 2.3.4 打印模型结构 三、总结 一、引言 上一…...

【NLP 42、实践 ⑪ 用Bert模型结构实现自回归语言模型的训练】

如果结局早已注定,那么过程就将大于结局 —— 25.3.18 自回归语言模型:由前文预测后文的语言模型 特点:单向 训练方式:利用前n个字预测第n1个字,实现一个mask矩阵,送入Bert模型,让其前文看不到…...

TCP | 序列号和确认号 [逐包分析] | seq / ack 详解

注 : 本文为 “TCP 序号(seq)与确认序号(ack)” 相关文章合辑。 英文引文,机翻未校。 中文引文,略作重排。 如有内容异常,请看原文。 Understanding TCP Seq & Ack Numbers […...

在Linux、Windows系统上安装开源InfluxDB——InfluxDB OSS v2并设置开机自启的保姆级图文教程

一、进入InfluxDB下载官网 InfluxData 文档https://docs.influxdata.com/Install InfluxDB OSS v2 | InfluxDB OSS v2 Documentation...

考研复习之队列

循环队列 队列为满的条件 队列为满的条件需要特殊处理,因为当队列满时,队尾指针的下一个位置应该是队头指针。但是,我们不能直接比较 rear 1 和 front 是否相等,因为 rear 1 可能会超出数组索引的范围。因此,我们需…...

Day 21: 数组中的逆序对

在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录 record,返回其中存在的「交易逆序对」总数。 示例 1: 输入:record [9…...

【C++教程】setw()函数的使用方法

setw 是 C 中用于设置输出字段宽度的函数&#xff0c;属于 <iomanip> 头文件。以下是其使用方法及注意事项&#xff1a; 基本用法 包含头文件&#xff1a; #include <iostream> #include <iomanip> // 必须包含此头文件 using namespace std; // 避免写 std…...

智慧高速,安全护航:视频监控平台助力高速公路高效运营

随着我国高速公路里程的不断增长&#xff0c;交通安全和运营效率面临着前所未有的挑战。传统的监控方式已难以满足现代化高速公路管理的需求&#xff0c;而监控视频平台的出现&#xff0c;则为高速公路的安全运营提供了强有力的技术支撑。高速公路视频监控联网解决方案 高速公路…...

Jboss漏洞再现

一、CVE-2015-7501 1、开环境 2、访问地址 / invoker/JMXInvokerServlet 出现了让下载的页面&#xff0c;说明有漏洞 3、下载ysoserial工具进行漏洞利用 4、在cmd运行 看到可以成功运行&#xff0c;接下来去base64编码我们反弹shell的命令 5、执行命令 java -jar ysoserial-…...

C语言三大程序结构 单分支语句

核心概念&#xff1a;程序就像流水线&#xff0c;通过顺序、选择、循环三种结构完成复杂任务 &#x1f31f; 一、三大程序结构图解 结构类型形象比喻代码示例顺序直行马路 → 不拐弯printf("A"); printf("B");选择岔路口 → 二选一if...else循环环形跑道 …...

【Linux系统】Linux权限讲解!!!超详细!!!

目录 Linux文件类型 区分方法 文件类型 Linux用户 用户创建与删除 用户之间的转换 su指令 普通用户->超级用户(root) 超级用户(root) ->普通用户 普通账户->普通账户 普通用户的权限提高 sudo指令 注&#xff1a; Linux权限 定义 权限操作 1、修改文…...

Winform零基础从入门到精通(5)——WinForm菜单与工具栏开发详解

一、核心控件与功能 MenuStrip&#xff08;顶部菜单栏&#xff09; • 功能&#xff1a;创建应用程序主菜单&#xff0c;支持多级子菜单和快捷键。 • 关键操作&#xff1a; ◦ 添加菜单项&#xff1a;直接在菜单栏输入文字&#xff08;如“文件(F)”&#xff09;&#xff0c;…...

2.创建Collection、添加索引、加载内存、预览和搜索数据

milvus官方文档 milvus2.3.1的官方文档地址: https://milvus.io/docs/v2.3.x 使用attu创建collection collection必须要有一个主键字段、向量字段 确保字段类型与索引类型兼容 字符串类型&#xff08;VARCHAR&#xff09;通常需要使用 Trie 索引&#xff0c;而不是 AutoInd…...

AIGC 新势力:探秘海螺 AI 与蓝耘 MaaS 平台的协同创新之旅

探秘海螺AI&#xff1a;多模态架构下的认知智能新引擎 在人工智能持续进阶的进程中&#xff0c;海螺AI作为一款前沿的多功能AI工具&#xff0c;正凭借其独特的多模态架构崭露头角。它由上海稀宇科技有限公司&#xff08;MiniMax&#xff09;精心打造&#xff0c;依托自研的万亿…...

一文解读DeepSeek在法律商业仲裁细分行业的应用

引言 当AI闯入法律界&#xff1a;DeepSeek如何把商业仲裁变成“纠纷快车道” AI技术正在像水电煤一样渗透生活&#xff0c;随着DeepSeek的爆火出圈&#xff0c;全国各行各业都在如火如荼地接入DeepSeek&#xff0c;以期望利用DeepSeek的“超能力”来重塑各自行业的效能和格局&a…...

快速入手-基于Django的主子表间操作mysql(五)

1、如果该表中存在外键&#xff0c;结合实际业务情况&#xff0c;那可以这么写&#xff1a; 2、针对特殊的字典类型&#xff0c;可以这么定义 3、获取元组中的字典值和子表中的value值方法 4、对应的前端页面写法...

HTTPS协议—加密算法和中间攻击人的博弈

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…...

【大模型理论篇】CogVLM:多模态预训练语言模型

1. 模型背景 前两天我们在《Skywork R1V: Pioneering Multimodal Reasoning with Chain-of-Thought》中介绍了将ViT与推理模型结合构造多模态推理模型的案例&#xff0c;其中提到了VLM的应用。追溯起来就是两篇前期工作&#xff1a;Vision LLM以及CogVLM。 今天准备回顾一下Cog…...

AI知识补全(一):tokens是什么?

名人说&#xff1a;苔花如米小&#xff0c;也学牡丹开。——袁枚《苔》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、什么是Tokens&#xff1f;二、为什么Tokens如此重要&#xff1f;1.模型的输入输出限制2.…...

Wpf Avalonia-实现中英文切换工程

文章目录 language工程项目代码创建获取资源文件string工程图片主项目引用LanguageView中使用ViewModel中使用language工程项目 <Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><ImplicitUsings>enable</ImplicitUsings><TargetFrame…...

pyqt5报错:qt.qpa.plugin: Could not find the Qt platform plugin “xcb“(已解决)

我在使用pyqt库的时候报错&#xff1a; qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in \ "/mnt/private_disk/anaconda3/envs/aot-manip/lib/python3.8/site-packages/PyQt5/Qt5/plugins/platforms" even though it was found. This ap…...

【MySQL数据库】触发器与事件

MySQL触发器 trigger&#xff0c;在表的插入insert、更新update、删除delete操作发生时自动执行MySQL语句。 学过Qt的都知道信号槽&#xff0c;一旦发出某个信号&#xff0c;那么就会触发关联的信号槽函数。触发器就类似于这个操作。 创建触发器时需要给出一些信息&#xff…...

【LC插件开发】基于Java实现FSRS(自由间隔重复调度算法)

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本文讲解【LC插件开发】基于Java实现FSRS&#xff08;自由间隔重复调度算法&#xff09;&#xff0c;期待与你一同探索、学习、进步&#xff0c;一起卷起来叭&#xff01; 目录…...

java后端接收数组,数组长度超256个就会报错

1.原因 DataBinder 中默认限制了list最大只能增长到256。 2.解决方案 1.在BaseController添加InitBinder方法&#xff0c;其余继承BaseController InitBinder //类初始化是调用的方法注解public void initBinder(WebDataBinder binder) {//给这个controller配置接收list的长…...

第45章:配置更新与应用热重载策略

第45章:配置更新与应用热重载策略 作者:DogDog_Shuai 阅读时间:约25分钟 难度:中级 目录 1. 引言2. 配置更新挑战3. Kubernetes原生配置更新机制4. 应用热重载技术5. 配置更新最佳实践...

数据库MVCC详解

MVCC 1.基本介绍 数据库&#xff1a;MySQL。【很多主流数据库都使用了MVCC&#xff0c;比如MySQL的InnoDB引擎、PostgreSQL、Oracle】 MVCC&#xff0c;全称Multi-Version Concurrency Control&#xff0c;即多版本并发控制。是数据库管理系统中的一种并发控制方法。 MVCC的…...