Netty原来就是这样啊(一)
前言:
当前对于整体而言来说就是说分为客户端以及服务端然后服务端接收到客户端的请求之后将客户端想要的结果返回给它,但是这个就需要建立一个连接进行数据的传输除此以外我们是通过网络进行传输的那么就需要网络协议 (TCP UDP),建立的连接就是叫Socket连接
Socket的具体介绍以及网络协议之间的区别:
Socket是一种基于基于TCP/IP协议的网络编程接口又叫做套接字,这个简单的理解就是进行数据传输进行连接的这个一般的话就是如客户端和服务端建立不同的连接,或者说在分布式的环境钟不同的服务之间的进行数据的同步的时候等等
这是客户端和服务端之间建立Socket连接,如我们要访问一个浏览器的时候那么这时候我们的请求就会发送个服务端之后服务端就会将网页的一些数据传输那么就会呈现出来了

TCP和UDP之间的区别: 1.从可靠性的角度来看的话,因为TCP建立连接的时候是需要进行三次握手断开连接的时候需要进行四次挥手但是UDP不需要这样做所以TCP更加可靠2.从传输的速度来看的话那么由于TCP更加可靠那么TCP的速率没有UDP的速率快
补充说明:对于网络编程而言是通过IP+端口+协议来进行唯一标识双方除此以外双方一定是相同的协议,端口号位于传输层,有两种协议,一种是TCP协议,一种是UDP协议
Netty:
一.什么是Netty:
Netty 是一个 NIO 客户端服务器框架,支持快速轻松地开发网络应用程序,例如协议服务器和客户端。它极大地简化和精简了 TCP 和 UDP 套接字服务器等网络编程。

二.其他的网络编程的方式:
1.多线程的网络编程方式:

这个不难看出当我们客户端个服务端每次建立一次连接的时候都需要创建一个线程来处理一个请求,但是每次创建一个线程里面的栈的固定的大小为1M并且线程还会存在上下文切换
缺点:
如果在高并发的场景之下那么客户端发送多个请求的话那么就创建很多的线程这个是会导致内存不足的以及消耗大量CPU资源如果在极端的情况下就有可能会使得CPU的利用率到达百分之200
2.线程池的网络编程方式

使用线程池的方式的话那么就很好解决了多线程方式的缺点
线程池可以看我的文章线程池和多线程就是这样啊-CSDN博客
缺点:
由于阻塞队列的存在那么就在高并发的时候客户端和服务端建立连接之后一个线程池中的线程复制监视之后,但是由于一直没有数据的话那么这个线程就会一直没有数据那么就会导致这个线程处于阻塞的状态,这个在该并发的场景之下的话会使得更多的其他的请求没有来得及被处理就会进入到阻塞队列中进行排队等待
3.NIO的网络编程方式

三大组件:
Buffer(缓冲区):每个客户端连接都会对应一个Buffer,读写数据通过缓冲区读写。
Channel(通道):每个channel用于连接Buffer和Selector,通道可以进行双向读写。
Selector(选择器):一个选择器对应多个通道,用于监听多个通道的事件。Selector可以监听所有的channel是否有数据要读取,当某个channel有数据时,就去处理,所有channel都没有数据时,线程可以去执行其他任务。
相对于传统的网络编程而言不是需要一直进行等待,因为这样就是会导致这个Socket端没有数据的话那么线程处于阻塞这个性能就是比较低,所以NIO就是如果线程处理的这个Socket没有请求的话不会阻塞一直等待,对于Socket端的话那么服务端就是会专门创建一个线程负责管理Selector(多路复用器不断的轮询注册其上的Channel(通道)中的 I/O 事件,如果IO有数据传输的话那么就会让其他后台的线程进行一个处理(这个就是IO多路复用就是基于NIO)
三.为什么要有Netty
经过上面的内容我们发现已经存在了NIO这个网络编程的方式为什么还要出现Netty这个框架这个难道不是一种浪费嘛,在这里我想要告诉你不是的,下面以一个例子来进行说明
// 创建一个Selector实例Selector selector = Selector.open();// 创建一个ServerSocketChannel实例并绑定到指定端口ServerSocketChannel serverSocket = ServerSocketChannel.open();serverSocket.configureBlocking(false);serverSocket.bind(new InetSocketAddress(8080));// 将ServerSocketChannel注册到Selector上,监听Accept事件serverSocket.register(selector, SelectionKey.OP_ACCEPT);while (true) {// 选择一组已经准备就绪的键// 返回值 0 超时// -1 错误//如果使用的是select的话如果没有任何的请求的话那么就会一直等待//select(long timeout)如果到了设置的时间还是没有请求的话那么就会返回int readyChannels = selector.select();if (readyChannels == 0) continue;// 获取已准备就绪的键的迭代器Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();while (iterator.hasNext()) {SelectionKey key = iterator.next();// 如果是Accept事件,处理新连接if (key.isAcceptable()) {ServerSocketChannel server = (ServerSocketChannel) key.channel();SocketChannel client = server.accept();client.configureBlocking(false);client.register(selector, SelectionKey.OP_READ);System.out.println("客户端进行连接了" );}// 如果是读取数据的请求的话if (key.isReadable()) {SocketChannel socketChannel = (SocketChannel) key.channel();ByteBuffer buffer = (ByteBuffer) key.attachment();buffer.clear();int read = socketChannel.read(buffer);if(read>0){String string = buffer.toString();System.out.println("有数据进行读取");}}// 移除已处理的键iterator.remove();}}}
原因如下:
1.这个代码总体来说就是比较复杂而且很多东西需要进行手动进行实现那么使得这个代码的可维护性就是会比较差
2.调用Selector.select()方法会获得的已经有事件发生的IO端但是如果处理完成之后不删除的话那么就会使得下次调用的时候还是会重新进行处理,这个对性能的影响是很大的
相关文章:
Netty原来就是这样啊(一)
前言: 当前对于整体而言来说就是说分为客户端以及服务端然后服务端接收到客户端的请求之后将客户端想要的结果返回给它,但是这个就需要建立一个连接进行数据的传输除此以外我们是通过网络进行传输的那么就需要网络协议 (TCP UDP),建立的连接就是叫Socket连接 Socket的具体介绍…...
量子容错计算
基本思想 容错量子计算的基本想法是,在合理编码后的量子态上直接量子计算,以至于不完全需要解码操作。假设有一个简单的量子电路,但不幸的是噪声影响着这个电路的每一个元件,包括量子态的制备、量子逻辑门、对输出的测量&#x…...
QGraphics View坐标系
QGraphics View绘图结构依赖三个类:QGraphicsScene,QGraphicsView,QGraphicsItem。 这三者的关系在前面已经介绍过:Graphics View 绘图架构-CSDN博客 这里介绍下这三者的坐标系,以及如何相互转换。 1. QGraphicsScen…...
繁星之下--
在一个宁静的小镇上,年轻的画家阿宁用她的画笔捕捉着四季的变换。这个小镇四季分明,春天的嫩芽、夏天的繁花、秋天的金黄和冬天的白雪,仿佛每一个季节都在向她诉说着自己的故事。阿宁常常在思考,如何将这些美丽的瞬间转化为永恒的…...
Transformer+KAN系列时间序列预测代码
前段时间,来自 MIT 等机构的研究者提出了一种非常有潜力的替代方法 ——KAN。该方法在准确性和可解释性方面表现优于 MLP。而且,它能以非常少的参数量胜过以更大参数量运行的 MLP。 KAN的发布,引起了AI社区大量的关注与讨论,同时…...
vue项目安装组件失败解决方法
1.vue项目 npm install 失败 删除node_modules文件夹、package-lock.json 关掉安装对话框 重新打开对话框 npm install...
C++ [项目] 躺平发育
一、基本介绍 支持Dev-C5.11版本(务必调为英文输入法),基本操作看游戏里的介绍,怎么做的……懒得说,能看懂就看注释,没有的自己猜,如果你很固执……私我吧 二、代码部分 #include<bits/stdc.h> #include<windows.h> #include<unistd.h> using namespace st…...
[产品管理-55]:产品设计不仅仅完成功能,即可用性设计,还需要完成可生产性、可装配性、可维护性、可回收性、可服务性设计
目录 可用性设计: 可生产性设计: 可装配性设计: 可维护性设计: 可回收性设计: 可服务性设计: 产品设计是一个综合性的过程,它不仅仅局限于完成产品的基本功能,即可用性设计&am…...
Mount Image Pro,在取证安全的环境中挂载和访问镜像文件内容
天津鸿萌科贸发展有限公司从事数据安全服务二十余年,致力于为各领域客户提供专业的数据恢复、数据备份解决方案与服务,并针对企业面临的数据安全风险,提供专业的相关数据安全培训。 天津鸿萌科贸发展有限公司是 GetData 公司数据恢复与取证工…...
玩转Docker | Docker基础入门与常用命令指南
玩转Docker | Docker基础入门与常用命令指南 引言基本概念help帮助信息常用命令管理镜像运行容器构建镜像其他Docker命令整理结语引言 Docker 是一种开源的应用容器引擎,它允许开发者将应用程序及其依赖打包进一个可移植的容器中,然后发布到任何流行的 Linux 机器上。这大大简…...
【MySQL】MySQL安装以及各种报错处理
前言: 本节内容讲述在Ubuntu环境下怎么进行MySQL的安装。 以及一些安装过程中遇到的报错如何处理的问题。 ps:注意, 本篇文章不是图形化界面的MySQL安装教程哦。想要安装图形化界面的MySQL的友友们可以另寻资源了。 目录 更新软件包列表 安装M…...
【传知代码】图像处理解决种子计数方法
文章目录 一、背景及意义介绍研究背景农业考种需求传统计数方法的局限性人工计数仪器设备计数 研究意义提高育种效率提高计数准确性广泛的适用性数据存档与分析便利 二、概述三、材料与数据准备以及方法介绍整体流程图像采集图像预处理形态学操作腐蚀运算开运算 图像二值化种子…...
WPF 特性------Binding
工业控制中,经常会需要把一个bool 型输入信号的状态显示在面板上,使用wpf 绑定的办法,可简洁实现: 实现步骤: 1,定义类: using System; using System.Collections.Generic; using System.Com…...
深入解析 FastAPI 查询参数:配置、类型转换与灵活组合
深入解析 FastAPI 查询参数:配置、类型转换与灵活组合 本文全面解析了 FastAPI 查询参数的使用方法,包括配置默认值、设为可选或必选参数、类型转换以及组合使用等实用技巧。通过查询参数,开发者可以在路径操作函数中接收动态输入࿰…...
大学城水电管理系统开发:Spring Boot指南
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
Lua 从基础入门到精通(非常详细)
目录 什么是 Lua? Lua 环境安装 Lua基本语法 注释 数据类型 nil(空) Boolean number(数字) string(字符串) function(函数) userdata thread tableÿ…...
[MySQL#11] 索引底层(2) | B+树 | 索引的CURD | 全文索引
目录 1.B树的特点 索引结构 复盘 其他数据结构的对比 B树与B树总结 聚簇索引与非聚簇索引 辅助索引 2. 索引操作 主键索引 1. 创建主键索引 第一种方式 第二种方式 第三种方式 2. 查询索引 第一种方法 第二种方法 第三种方法 3. 删除索引 删除主键索引 删除…...
一个指针可以被声明为 `volatile`
一个指针可以被声明为 volatile。当指针被声明为 volatile 时,指针本身的地址值可能会在程序之外的控制下发生变化,这意味着编译器在使用该指针时必须每次都重新从内存中读取它的地址,而不能假设指针的地址保持不变。 为什么指针可以是 vola…...
[0260].第25节:锁的不同角度分类
MySQL学习大纲 我的数据库学习大纲 从不同维度对锁的分类: 1.对数据操作的类型划分:读锁和写锁 1.1.读锁 与 写锁概述: 1.对于数据库中并发事务的读-读情况并不会引起什么问题。对于写-写、读-写或写-读这些情况可能会引起一些问题,需要使用…...
android数组控件Textview
说明:android循环控件,注册和显示内容 效果图: step1: E:\projectgood\resget\demozz\IosDialogDemo-main\app\src\main\java\com\example\iosdialogdemo\TimerActivity.java package com.example.iosdialogdemo;import android.os.Bundl…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
