netty 总结

news2024/12/24 2:07:59

1. NIO和BIO的比较


BIO以流的方式处理数据,而NIO以块的方式处理数据,块I/O的效率比流I/O高很多。
BIO是阻塞的,NIO是非阻塞的
BIO基于字节流和字符流进行操作,而NIO是基于Channel(通道)和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中
Selector(选择器)用于监听多个通道的事件,(比如连接请求,数据到达等)因此使用单个线程就可以监听多个客户端通道。

2. NIO中三大组件关系

nio三大组件:channel、buffer、selector


每个channel都会对应一个Buffer
Selector都对应一个线程,一个线程对应多个channel(连接)
该图反应了有三个channel注册到该selector中
程序切换到哪个channel是由事件决定的,Event就是一个重要的概念。
selector会根据不同的事件,在各个通道上切换。
buffer就是一个内存块,底层有一个数组。
数据的读取写入是通过buffer,这个和BIO本质不同,BIO中要么是输入流或者是输出流,不会是双向的,而NIO中的buffer可读可写,需要flip方法切换。
channel是双向的,可以返回底层操作系统的情况,如linux,底层的操作系统就是双向的

与netty有什么关系

Netty的IO线程 NioEventLoop 聚合了 Selector(选择器,也叫多路复用器),可以同时并发处理成百上千个客户端连接。
当线程从某客户端 Socket 通道进行读写数据时,若没有数据可用时,该线程可以进行其他任务。
线程通常将非阻塞IO的空闲时间用于在其他通道上执行 IO 操作,所以单独的线程可以管理多个输入和输出通道。
由于读写操作都是非阻塞的,这就可以充分提升 IO 线程的运行效率,避免由于频繁 I/O 阻塞导致的线程挂起。
一个I/O线程可以并发处理N个客户端连接和读写操作,这从根本上解决了传统同步阻塞I/O一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升
Selector、selectionKey、ServerSocketChannel和SocketChannel关系梳理图。

当客户端连接时,会通过ServerSocketChannel得到SocketChannel
将socketChannel注册到Selector上,regist(Slector sel,int ops),一个selector上可以注册多个SocketChannel。
注册后返回一个SelectionKey,回纥该Selector关联(集合)
Selector进行监听select方法,返回有事件发生通道的个数
进一步得到各个 SelectionKey (有事件发生)
再通过SelectionKey反向获取 SocketChannel,方法 channel()
可以通过 得到的 channel , 完成业务处理
 

 

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

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

相关文章

Android 反编译apk,然后修改内容后二次签名打包

1. 下载apktool.jar ,下载地址: iBotPeaches / Apktool / Downloads — Bitbucket 2. mac电脑使用 apksigner 方式签名, 需要配置环境. 2.1 命令行输入: open .bash_profile, 在打开的环境配置文件中添加,根据自己SDK目录配置 export APK_SIGNER_HOME/opt/android-sd…

QML TreeView 简单使用

本文主要介绍 QML 中 TreeView 的基本使用方法,包括:TreeView的适用场景; 控件简介 QML TreeView 是 Qt Quick 中的一个组件,用于显示树形结构的数据。它提供了一种以层次结构方式展示数据的方式,其中每个节点可以包含…

蒸汽朋克 VoxEdit 竞赛

欢迎来到蒸汽朋克 VoxEdit 比赛,在这个充满装备和蒸汽的世界里,创意和体素互相碰撞,激发无尽创意! 蒸汽朋克是将过去重新想象为带有未来主义色彩的风格。通过将维多利亚时代的优雅与蒸汽动力机械和黄铜装置相结合,将您…

【强烈推荐】 十多款2023年必备国内外王炸级AI工具 (免费 精品 好用) 让你秒变神一样的装逼佬感受10倍生产力 (2) AI修音

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…

C# 特性

目录 什么是特性 Serializable DllImport Obsolete Conditional 自定义Attribute 特性定义:特性其实是一个类,是直接/间接继承自Attribute,约定俗成是以Attribut结尾,在标记的时候以[ ]包裹,尾部的Attribut可以…

竞赛知识点5【图论】

文章目录 前言基本概念图的定义和分类路径顶点的度、入度、出度图的存储图的DFS遍历图的BFS遍历判断是否为欧拉图拓扑排序关键路径前言 图论起源于著名的哥尼斯堡七桥问题——从这四块陆地中任何一块开始,通过每一座桥正好 一次,再回到起点。欧拉在 1736 年解决了这个问题,…

【计算机视觉】千字汇总:一文读懂计算机视觉,干货满满记得收藏

文章目录 一、前言二、计算机视觉为什么重要三、什么是计算机视觉四、计算机视觉的基本原理五、计算机视觉的典型任务5.1 图像分类5.2 目标检测5.3 语义分割5.4 实例分割5.5 目标追踪 六、计算机视觉在日常生活中的应用场景6.1 门禁、支付宝上的人脸识别6.2 停车场、收费站的车…

Android——布局管理器(十一)

1. 线性布局管理器:LinearLayout 1.1 知识点 (1)布局管理器简介; (2)线型布局管理器的配置; (3)通过Activity程序进行线型布局 1.2 具体内容 在android中&#xff…

java elasticsearch 实现以图搜图效果

前言: 现在需要用javaelasticsearch的方式实现以图搜图的效果,根据下面的文章内容做了一点修改 相关文章:https://blog.csdn.net/m0_52640724/article/details/129357847 一、相关环境 java:jdk11 elasticsearch:7.17…

行情不好进阶困难?那是因为你没有选对方向

关注“软件测试藏经阁”微信公众号,回复暗号【软件测试】,即可获取氪肝整理的全套测试资源 IT行情彻底崩盘了? 相信凡是在抖音关注过互联网相关内容的同学,应该会经常听到这句话吧!没错就是号称“某蛙之父”的那个人天…

【LeetCode】HOT 100(13)

题单介绍: 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

JavaScript中getElementById与querySelector区别

JavaScript中getElementById与querySelector区别 1、getElement(s)Byxxxx 的用法1.1 getElementById() 方法1.2 getElementsByClassName() 方法1.3 getElementsByTagName() 方法 2、querySelector() 和 querySelectorAll() 用法2.1 querySelector() 方法2.2 querySelectorAll()…

Big O示例与Python数据结构的Big O

在Big-O示例部分的第一部分,我们将介绍各种Big-O函数的各种迭代。 让我们从一些简单的例子开始,探索大O是什么。 O(1) Constant def func_constant(values):Prints first item in a list of values.print(values[0])func_constant([1,2,3])# 1请注意&a…

避雷器计数器测试仪

原理 图1所示为JS动作记数器的原理接线图。图1(a)为JS动作记数器的基本结构,即所谓的双阀片式结构。当避雷器动作时,放电电流流过阀片R1,在R1上的压降经阀片R2给电容器C充电,然后C再对电磁式记数器的电感线…

easyX基本概念(注释版)

0.前言 本次我给您带来easyX库系列的博文,本系列博文目的在于对原easyX库文档进行一个补充和注解,重在补充测试样例和实践。 easyX库本身并不值得过于学习,但是作为有C语言基础的C爱好者,学习easyX能让您对IT技术更加感兴趣。用…

AI完成音频创作,击败99%作者

使用AI完成音频创作 ,击败99%同类创作者 ,享受持续广告变现收益 ,下面我们来看下如何使用把~ 音频生成和投放可以分为以下两步骤: 使用AI效能公众号完成内容创作;利用喜马拉雅云剪辑发布内容 1. 内容生成 打开AI效能公…

Altium Designer 15 (AD15)新建元件库

1. 连接线 1.1 设置连接线的默认颜色,宽度:点击图标 --》按Tab键 1.2 默认使用蓝色,通用 2. 调出来元件库,然后按照元件的英文名字搜元件,拖到左边画图区域就可以了 3. 自己画一个元器件,自定义元器件 3.1…

6.14 消息队列

目录 消息队列 消息队列结构 消息队列使用步骤 消息队列创建/打开-msgget 消息队列创建/打开 - 示例 消息发送 – msgsnd 消息格式 消息发送 - 示例 笔记 消息队列 消息队列是System V IPC对象的一种 消息队列由消息队列ID来唯一标识 消息队列就是一个消息的列表。…

解决Idea中日志文件log4j.xml中http//jakarta.apache.org/log4j爆红,报错此 uri is not registered

在Idea中&#xff0c;配置log4j.xml出现“http //jakarta.apache.org/log4j/ uri is not registered”的错误信息&#xff0c;解决步骤如下&#xff1a; 1、原始的log4j.xml配置文件&#xff1a; <?xml version"1.0" encoding"GB2312" ?> <!…

ESP32(Micro Python)LVGL 四路ADC

本程序布局与上一个程序相同&#xff0c;引脚不重合&#xff0c;可以在不更换外设的情况下切换程序。由于仪表盘显示的数值范围不可调&#xff0c;实际显示的值为测量值占量程的百分比。 代码如下 import lvgl as lv import time from espidf import VSPI_HOST from ili9XX…