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 是更优选择。

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

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

相关文章

我的uniapp自定义模板

uniapp自定义模板 如有纰漏请谅解,以官方文档为准后面这段时间我会学习小程序开发的知识,会持续更新可以查看我的github,后续我会上传我的uniapp相关练习代码有兴趣的话可以浏览我的个人网站,我会在上面持续更新内容,…

Wispr Flow,AI语言转文字工具

Wispr Flow是什么 Wispr Flow 是AI语音转文本工具,基于先进的AI技术,帮助用户在任何应用程序中实现快速语音转文字。 Wispr Flow支持100多种语言,具备自动编辑、上下文感知和低音量识别等功能,大幅提升写作和沟通效率。Wispr Fl…

美国国家数据浮标中心(NDBC)

No.大剑师精品GIS教程推荐0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 1Openlayers 【入门教程】 - 【源代码示例 300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3MapboxGL【入门教程】 - 【源代码图文示例150】 4Cesium 【入门教程】…

浔川社团官方联合会维权成功

在2025.3.2日,我社团检测文章侵权中,检测出3篇文章疑似遭侵权,随后,总社团联合会立即联系CSDN版权,经过17天的维权,至今日晚,我社团维权成功!侵权文章全部被设置为转载。 在此&…

linux中如何修改文件的权限和拥有者所属组

目录标题 chmod指令八进制形式权限修改文件拥有者所属组的修改umask有关内容 chmod指令 chmod指令可以用来修改人员的权限其形式如下: u代表的是拥有者,g代表的是所属组,o代表的是其他人,a表示所有人,如果你想增加权…

SmolVLM2: 让视频理解能力触手可及

一句话总结: SmolVLM 现已具备更强的视觉理解能力📺 SmolVLM2 标志着视频理解技术的根本性转变——从依赖海量计算资源的巨型模型,转向可在任何设备运行的轻量级模型。我们的目标很简单: 让视频理解技术从手机到服务器都能轻松部署。 我们同步发布三种规…

人工智能将使勒索软件更加危险

Ivanti 预测,勒索软件将成为 2025 年的最大威胁,这一点尤其令人担忧,因为 38% 的安全专家表示,在人工智能的帮助下,勒索软件将变得更加危险。 与威胁级别相比,只有 29% 的安全专家表示他们对勒索软件攻击做…

UE AI 模型自动生成导入场景中

打开小马的weix 关注下 搜索“技术链” 回复《《动画》》 快速推送; 拿到就能用轻松解决!帮忙点个关注吧!

Debain-12.9使用vllm部署内嵌模型/embedding

Debain-12.9使用vllm部署内嵌模型/embedding 基础环境准备下载模型部署模型注册dify模型 基础环境准备 基础环境安装 下载模型 modelscope download --model BAAI/bge-m3 --local_dir BAAI/bge-m3部署模型 vllm serve ~/ollama/BAAI/bge-m3 --served-model-name bge-m3 --t…

电子学会—2023年12月青少年软件编程(图形化)三级等级考试真题——打砖块游戏

完整题目可查看,支持在线编程: 打砖块游戏_scratch_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/scratch/show-5112.html?_shareid3 程序演示可查看,支持获取源码: 打砖块游戏-scratch作品-少儿编程题库学习中心…

【Attention】SKAttention

SKAttention选择核注意力 标题:SKAttention 期刊:IEEE2019 代码: https://github.com/implus/SKNet 简介: 动机:增大感受野来提升性能、多尺度信息聚合方式解决的问题:自适应调整感受野大小创新性:提出选择性内核…

OceanBase 社区年度之星专访:社区“老炮”代晓磊与数据库的故事

2024年年底,OceanBase 社区颁发了“年度之星”奖项,以奖励过去一年中对社区发展做出卓越贡献的个人。今天,我们有幸邀请到“年度之星”得主 —— 知乎的代晓磊老师,并对他进行了专访。 代晓磊老师深耕数据库运维与开发领域超过14…

Androidstudio实现引导页文字动画

文章目录 1. 功能需求2. 代码实现过程1. 编写布局文件2. 实现引导页GuideActivity 3. 总结4. 效果演示5. 关于作者其它项目视频教程介绍 1. 功能需求 1、引导页具有两行文字(“疫情在前”和“共克时艰”),和向上的 图标。 2、进入【引导页】…

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

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

Linux vim mode | raw / cooked

注:机翻,未校。 vim terminal “raw” mode Vim 终端 “raw” 模式 1. 原始模式与已处理模式的区别 We know vim puts the terminal in “raw” mode where it receives keystrokes as they are typed, opposed to “cooked” mode where the command…

【Linux线程】——线程概念线程接口

目录 前言 1.线程 2.线程的本质 3.Linux线程库 3.1创建线程——pthread_create 3.2线程终止——pthread_exit 3.3线程等待——pthread_join 3.4线程分离——pthread_detach 3.5获取线程tid——pthread_self 4.线程的优缺点 4.1线程的优点 4.2线程的缺点 结语 前言…

机器学习——KNN超参数

sklearn.model_selection.GridSearchCV 是 scikit-learn 中用于超参数调优的核心工具,通过结合交叉验证和网格搜索实现模型参数的自动化优化。以下是详细介绍: 一、功能概述 GridSearchCV 在指定参数网格上穷举所有可能的超参数组合,通过交叉…

STM32基础教程——定时器

前言 TIM定时器(Timer):STM32的TIM定时器是一种功能强大的外设模块,通过时基单元(包含预分频器、计数器和自动重载寄存器)实现精准定时和计数功能。其核心原理是:内部时钟(CK_INT)或…

[特殊字符] 树莓派声卡驱动原理全解析:从模拟耳机口到HiFi DAC

一、为什么要关注树莓派的声卡驱动? 树莓派(Raspberry Pi)作为一款广泛应用的单板计算机,集成了多种音频输出接口(如 3.5mm 耳机、HDMI、I2S 外接 DAC 等)。但许多用户在使用中会遇到诸如“耳机输出杂音”…

使用若依AI生成springBoot的前后端分离版本

目录 1. 从Git上面下载前后端分离版本 2. 执行SQL脚本 3. 初始化前端 安装Node.js和npm配置 ✅ 第一步:在 Node 安装目录下创建两个文件夹 ✅ 第二步:配置 npm 全局目录和缓存目录 ✅ 第三步:验证配置是否成功 ✅ 第四步:…