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…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...