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

第六章 QT基础:5、QT的UDP网络编程

在 Qt 中,QUdpSocket 类用于实现基于 UDP 协议的网络通信。UDP(用户数据报协议)是一种无连接的协议,与 TCP 不同,它不需要建立连接,因此它的传输速度较快,但也不保证数据的可靠传输。


1. Qt UDP 编程概述

UDP 是一种无连接的协议,在网络上发送数据时不需要与接收方建立连接,数据直接发送到目标地址的指定端口。由于其无连接性,UDP 具有较低的延迟和较高的传输效率,但也无法保证数据的可靠性。

Qt 提供了 QUdpSocket 类来实现 UDP 网络编程。它支持绑定本地端口、接收数据报和发送数据报。

2. QUdpSocket 类的常用方法

  • bind():将本地套接字绑定到指定端口,开始监听该端口上的数据报。

  • writeDatagram():发送数据报到指定的地址和端口。

  • hasPendingDatagrams():检查是否有待处理的接收数据报。

  • readDatagram():读取接收到的一个数据报。

  • close():关闭 UDP 套接字。

3. 代码示例(带详细注释)

下面是一个使用 QUdpSocket 进行简单的 UDP 网络编程的示例,功能包括接收数据、发送数据以及端口绑定。

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);// 创建 UDP 套接字udpSocket = new QUdpSocket(this);  // 使用 this 作为父对象
}Widget::~Widget()
{delete ui;  // 删除 UI 对象
}// 槽函数,用于处理接收到的数据报
void Widget::readyRead_slot()
{// 检查是否有待处理的数据报while (udpSocket->hasPendingDatagrams()) {QByteArray array;// 根据待处理数据报的大小调整数组的大小array.resize(udpSocket->pendingDatagramSize());// 读取数据报udpSocket->readDatagram(array.data(), array.size());// 将接收到的字节数组转换为 QString 类型,以便显示QString buf = QString::fromUtf8(array);// 将接收到的消息显示在 UI 的接收框中ui->recvEdit->appendPlainText(buf);}
}// 点击 "打开" 按钮后绑定端口
void Widget::on_openBt_clicked()
{bool ok;// 从界面中获取输入的端口号,并尝试将其转换为 quint16 类型quint16 localPort = ui->localPort->text().toUInt(&ok); // 如果端口号转换失败或端口号为 0,则弹出警告框提示用户if (!ok || localPort == 0) {QMessageBox::warning(this, "警告", "请输入有效的端口号");return;}// 绑定端口号到本地套接字if (udpSocket->bind(localPort)) {// 绑定成功,弹出信息框提示用户QMessageBox::information(this, "提示", "成功绑定端口");} else {// 绑定失败,弹出错误信息框QMessageBox::critical(this, "错误", "绑定端口失败,请检查端口是否被占用");}// 连接信号与槽,当数据报到达时触发 readyRead_slotconnect(udpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_slot()));
}// 点击 "关闭" 按钮后关闭 UDP 套接字
void Widget::on_closeBt_clicked()
{udpSocket->close();  // 关闭套接字,停止接收数据
}// 点击 "发送" 按钮后发送数据
void Widget::on_sendBt_clicked()
{quint16 port;QString sendbuf;QHostAddress address;// 从界面获取目标 IP 地址并设置address.setAddress(ui->aimIP->text());// 从界面获取要发送的文本sendbuf = ui->sendEdit->text();// 从界面获取目标端口号port = ui->aimPort->text().toUInt();// 使用 writeDatagram() 发送数据报udpSocket->writeDatagram(sendbuf.toUtf8(), address, port);
}

4. 代码逐行解释

4.1 初始化套接字
udpSocket = new QUdpSocket(this);  // 创建 UDP 套接字对象,并将当前窗口作为父对象
  • 这里我们创建了一个 QUdpSocket 对象来进行 UDP 通信。this 作为父对象传入,确保在 Widget 被销毁时,udpSocket 也会被正确清理。
4.2 接收数据(readyRead_slot)
while (udpSocket->hasPendingDatagrams()) {QByteArray array;array.resize(udpSocket->pendingDatagramSize());udpSocket->readDatagram(array.data(), array.size());QString buf = QString::fromUtf8(array);ui->recvEdit->appendPlainText(buf);
}
  • hasPendingDatagrams():检查是否有待接收的数据报。

  • readDatagram():读取接收到的一个数据报,并将数据存储到 array 中。

  • 将接收到的字节数据 array 转换为 QString,然后显示在界面上的文本框中。

4.3 打开端口并绑定(on_openBt_clicked)
quint16 localPort = ui->localPort->text().toUInt(&ok);
if (!ok || localPort == 0) {QMessageBox::warning(this, "警告", "请输入有效的端口号");return;
}
if (udpSocket->bind(localPort)) {QMessageBox::information(this, "提示", "成功绑定端口");
} else {QMessageBox::critical(this, "错误", "绑定端口失败,请检查端口是否被占用");
}
  • 从界面的文本框中获取本地端口号,并尝试将其转换为整数类型。

  • 调用 bind() 方法绑定指定的端口,如果成功则弹出提示框。

4.4 发送数据(on_sendBt_clicked)
udpSocket->writeDatagram(sendbuf.toUtf8(), address, port);
  • 获取目标 IP 地址、端口号以及要发送的消息内容。

  • 使用 writeDatagram() 方法将数据报发送到指定的目标 IP 和端口。

4.5 关闭 UDP 套接字(on_closeBt_clicked)
udpSocket->close();  // 关闭 UDP 套接字
  • 调用 close() 方法关闭 UDP 套接字,停止接收数据。

5. Qt 中的信号与槽

Qt 使用信号与槽机制来实现事件驱动编程。当某个事件发生时(如按钮点击、数据到达等),会触发一个信号,信号会连接到一个槽(函数),从而执行相应的操作。

在本例中,当接收到数据时,readyRead() 信号会被触发,并调用 readyRead_slot() 槽函数来处理接收到的数据。

connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_slot()));

最后实现:
![[Pasted image 20250422161717.png]]

6. 总结

通过 QUdpSocket 类,Qt 提供了一种简便的方式来进行 UDP 网络通信。本示例展示了如何实现一个简单的 UDP 客户端,能够绑定端口、接收数据报、发送数据报,并且关闭 UDP 套接字。使用 Qt 进行 UDP 编程非常直观,尤其适用于实时性较高的应用,如实时聊天、传感器数据采集等。

相关文章:

第六章 QT基础:5、QT的UDP网络编程

在 Qt 中&#xff0c;QUdpSocket 类用于实现基于 UDP 协议的网络通信。UDP&#xff08;用户数据报协议&#xff09;是一种无连接的协议&#xff0c;与 TCP 不同&#xff0c;它不需要建立连接&#xff0c;因此它的传输速度较快&#xff0c;但也不保证数据的可靠传输。 1. Qt UDP…...

JAVA设计模式——(五)享元模式(Flyweight Pattern)

JAVA设计模式——&#xff08;五&#xff09;享元模式&#xff08;Flyweight Pattern&#xff09; 概念理解实现创建内部状态定义享元工厂测试 适用性 概念 使共享对象可以有效的支持大量的细粒度对象。主要采用池技术实现。 理解 享元模式主要解决大量对象的共享&#xff0…...

电竞俱乐部护航点单小程序,和平地铁俱乐部点单系统,三角洲护航小程序,暗区突围俱乐部小程序

电竞俱乐部护航点单小程序开发&#xff0c;和平地铁俱乐部点单系统&#xff0c;三角洲护航小程序&#xff0c;暗区突围俱乐部小程序开发 端口包含&#xff1a; 超管后台&#xff0c; 老板端&#xff0c;打手端&#xff0c;商家端&#xff0c;客服端&#xff0c;管事端&#x…...

mybatis log convert使用

1. idea 搜索插件 mybatis log convert. 安装后重启idea 启动程序. 日志打印后选中输出的内容右键。这里随意选中一段日志做演示 必须要在console中复制才能使用这个日志解析 2. 还有一种用法。没找到...

[U-Net]DA-TRANSUNET

论文题目:DA-TRANSUNET: INTEGRATING SPATIAL AND CHANNEL DUAL ATTENTION WITH TRANSFORMER U-NET FOR MEDICAL IMAGE SEGMENTATION ∗ 中文题目:DA-TRANSUNET:结合空间和通道双注意力与Transformer U-NET的医学图像分割算法 0摘要 精确的医学图像分割对疾病定量和治疗评…...

AI大模型从0到1记录学习 数据结构和算法 day20

4.3 分治算法 4.3.1 概述 分治算法的基本思想为&#xff1a;将原问题递归的分解为若干个&#xff08;通常是两个以上&#xff09;规模较小、相互独立且性质相同的子问题&#xff0c;直到子问题足够简单&#xff0c;简单到可以直接求解。然后再返回结果&#xff0c;逐个解决上层…...

面阵相机中M12镜头和远心镜头的区别及性能优势

以下是关于面阵相机中M12镜头和远心镜头的区别及性能优势的详细分析&#xff0c;结合知识库内容整理如下&#xff1a; 一、M12镜头与远心镜头的核心区别 1. 设计原理与光学特性 特性M12镜头远心镜头光学设计标准镜头设计&#xff0c;无特殊光学校正&#xff0c;依赖传统光路。…...

[创业之路-385]:企业法务 - 初创公司如何做好商业秘密的管理

一、商业秘密的定义与价值 定义&#xff1a; 商业秘密是企业的核心资产&#xff0c;包括技术信息&#xff08;如算法、配方&#xff09;和经营信息&#xff08;如客户名单、定价策略&#xff09;&#xff0c;具有非公开性、商业价值、保密性三大特征。价值&#xff1a; 初创公…...

Qt5.15.2+OpenCV4.9.0开发环境搭建详细图文教程(OpenCV使用Qt自带MinGW编译的全过程,包教包会)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》 《实用硬件方案设计》 《结构建模设…...

怎么实现RAG检索相似文档排序:similarities

怎么实现RAG检索相似文档排序:similarities top_5_indices = similarities.argsort()[-5:][::-1] 这行代码的作用是从一组相似度得分中获取相似度最高的5个元素的索引。 similarities:这是一个包含了某个问题与所有文档之间余弦相似度得分的一维数组(假设 similarities 是通…...

NLP高频面试题(五十三)——深度学习正则化详解

一、动因篇 为什么要正则化? 深度神经网络通常包含数以万计甚至数以亿计的参数,模型容量极大,极易在有限的训练数据上“记住”噪声与异常样本,从而出现过拟合(overfitting)现象。过拟合导致模型在训练集上表现优异,但在测试集或真实场景中泛化能力大幅下降。正则化(r…...

2.idea查看某个类的方法名称和实现

2.idea查看某个类的方法名称和实现 ctrl鼠标左键单击类名 点击侧边栏Structure可看到方法名称的统计&#xff0c;这样直观...

FeignClient用法笔记

1. FeignClient简介 在微服务架构中总需要各个服务相互调用&#xff0c;各个服务又是以接口方式暴露&#xff0c;所以需要Http远程调用&#xff1b;为了简化调用&#xff0c;Spring Cloud OpenFeign 库提供了org.springframework.cloud.openfeign.FeignClient 注解&#xff1a…...

【Redis】 Redis中常见的数据类型(二)

文章目录 前言一、 List 列表1. List 列表简介2.命令3. 阻塞版本命令4. 内部编码5. 使用场景 二、Set 集合1. Set简单介绍2. 普通命令3 . 集合间操作4. 内部编码5. 使用场景 三、Zset 有序集合1.Zset 有序集合简介2. 普通命令3. 集合间操作4. 内部编码5. 使用场景 结语 前言 在…...

电力作业安全工器具全解析:分类、配置与检查要点

在电力行业&#xff0c;每一次作业都面临潜在危险&#xff0c;安全工器具是保障作业人员生命安全的关键。今天&#xff0c;金能电力带大家深入了解电力作业中常见的安全工器具&#xff0c;以及它们的检查与使用要点。 电力作业中安全工器具种类繁多。绝缘安全工器具因直接关联带…...

PowerBI-使用参数动态修改数据源路径

PowerBI-使用参数动态修改数据源路径 在PowerQuery中可以使用参数&#xff0c;通过参数我们可以将多个文件路径相同的字符串进行替换。 以一个案例分享下过程&#xff1a; 第一步&#xff0c;导入一个含有多个sheet表的EXCEL工作薄&#xff0c;点击转换数据&#xff0c;如图…...

Temperature

模型中Temperature参数的详细解释 ​​Temperature​​ 是生成模型&#xff08;如GPT、LLaMA等&#xff09;中用于控制输出多样性和随机性的关键超参数。它通过调整模型预测概率分布的平滑程度&#xff0c;直接影响生成文本的创造性与稳定性。 模型中Temperature参数的详细解…...

C++ 日志系统实战第二步:不定参数函数解析

全是通俗易懂的讲解&#xff0c;如果你本节之前的知识都掌握清楚&#xff0c;那就速速来看我的项目笔记吧~ 相关技术知识补充 不定参宏函数 在 C 语言中&#xff0c;不定参宏函数是一种强大的工具&#xff0c;它允许宏接受可变数量的参数&#xff0c;类似于不定参函数&#…...

【高并发】 MySQL锁优化策略

在数据库高并发场景中&#xff0c;行锁、表锁和高并发处理是密切相关的概念&#xff0c;它们共同影响着系统的并发性能和数据一致性。以下是三者的详细解释及高并发处理的策略&#xff1a; 1. 行锁&#xff08;Row-Level Locking&#xff09; 行锁是数据库中最小的锁粒度&…...

C语言——填充矩阵

C语言——填充矩阵 一、问题描述二、格式要求1.输入形式2.输出形式3.样例 三、实验代码 一、问题描述 编程实现自动填充nn矩阵元素数值&#xff0c;填充规则为&#xff1a;从第一行最后一列矩阵元素开始按逆时针方向螺旋式填充数值1&#xff0c;2&#xff0c;…&#xff0c;nn…...

CSS3 基础(背景-文本效果)

二、背景效果 属性功能示例值说明background设置背景颜色或渐变background: linear-gradient(45deg, #4CAF50, #FF5722);设置背景颜色、图片或渐变效果。background-size调整背景图片大小background-size: cover;设置背景图片的显示大小&#xff0c;如 cover 或 contain。back…...

点云配准算法之NDT算法原理详解

一、算法概述 NDT&#xff08;Normal Distributions Transform&#xff09;最初用于2D激光雷达地图构建&#xff08;Biber & Straer, 2003&#xff09;&#xff0c;后扩展为3D点云配准。它将点云数据空间划分为网格单元&#xff08;Voxel&#xff09;&#xff0c;在每个体…...

springboot在eclipse里面运行 run as 是Java Application还是 Maven

在 Eclipse 里运行 Spring Boot 项目时&#xff0c;既可以选择以“Java Application”方式运行&#xff0c;也可以通过 Maven 命令来运行&#xff0c;下面为你详细介绍这两种方式及适用场景。 以“Java Application”方式运行 操作步骤 在项目中找到带有 SpringBootApplicat…...

Redis 基础和高级用法入门

redis 是什么&#xff1f; Redis是一个远程内存数据库&#xff0c;它不仅性能强劲&#xff0c;而且还具有复制特性以及为解决问题而生的独一无二的数据模型。Redis提供了5种不同类型的数据结构&#xff0c;各式各样的问题都可以很自然地映射到这些数据结构上&#xff1a…...

使用vue2开发一个在线旅游预订平台-前端静态网站项目练习

hello,大家好&#xff0c;今天给大家再分享一个前端vue2练习项目-在线旅游预订平台。我们在学习编程的时候&#xff0c;除了学习编程的基础知识&#xff0c;为了让我们快速的掌握一门编程技术&#xff0c;肯定离不开各种项目的练习&#xff0c;今天分享的这个前端练习项目&…...

Ext Direct 功能与使用详解

Ext Direct 是 Ext JS 框架中的一个功能模块,旨在简化前端 JavaScript 应用与后端服务器之间的通信。其核心思想是通过远程过程调用(RPC)协议,将服务器端的方法透明地映射为前端可直接调用的 JavaScript 函数,从而减少手动编写 Ajax 请求和处理响应的代码量。 一、Ext Dir…...

Android移动应用开发入门示例:Activity跳转界面

介绍如何使用LinearLayout布局实现基本的UI设计&#xff0c;并实现两个Activity之间的跳转&#xff0c;适合刚接触Android Studio的新手学习。我们将使用Java语言开发&#xff0c;布局采用XML文件。以下为完整源码与运行说明&#xff1a; 案例前的准备工作&#xff1a; 1.1XM…...

【hadoop】HBase分布式数据库安装部署

一、HBase集群的安装与配置 步骤&#xff1a; 1、使用XFTP将HBase安装包hbase-1.2.0-bin.tar.gz发送到master机器的主目录。 2、解压安装包&#xff1a; tar -zxvf ~/hbase-1.2.0-bin.tar.gz 3、修改文件夹的名字&#xff0c;将其改为hbase&#xff0c;或者创建软连接也可…...

理解npm的工作原理:优化你的项目依赖管理流程

目录 什么是npm npm核心功能 npm 常用指令及其作用 执行npm i 发生了什么? 1. 解析命令与参数 2. 检查依赖文件 3. 依赖版本解析与树构建 4. 缓存检查与包下载 5. 解压包到 node_modules 6. 更新 package-lock.json 7. 处理特殊依赖类型 8. 执行生命周期脚本 9. …...

【Python笔记 04】输入函数、转义字符

一、Input 输入函数 prompt是提示&#xff0c;会在控制台显示&#xff0c;用作提示函数。 name input("请输入您的姓名&#xff1a;") print (name)提示你输入任意信息&#xff1a; 输入input test后回车&#xff0c;他输出input test 二、常用的转义字符 只讲…...

MySQL数据库基本操作-DQL-基本查询

数据库的操作中&#xff0c;查询是最重要的 一、基本查询-数据准备 -- 数据准备 create database if not exists mydb2; use mydb2; create table product( pid int primary key auto_increment, pname varchar(20) not null, price double, category_id varchar(20) …...

13、性能优化:魔法的流畅之道——React 19 memo/lazy

一、记忆封印术&#xff08;React.memo&#xff09; 1. 咒语本质 "memo是时间转换器的记忆晶石&#xff0c;冻结无意义的能量波动&#xff01;" 通过浅层比较&#xff08;shallowCompare&#xff09;或自定义预言契约&#xff0c;阻止组件在props未变时重新渲染。 …...

低代码平台开发手机USB-HID调试助手

项目介绍 USB-HID调试助手是一种专门用于调试和测试USB-HID设备的软件工具。USB-HID设备是一类通过USB接口与计算机通信的设备&#xff0c;常见的HID设备包括键盘、鼠标、游戏控制器、以及一些专用的工业控制设备等。 主要功能包括&#xff1a; 数据监控&#xff1a;实时监控和…...

Langchain_Agent+数据库

本处使用Agent数据库&#xff0c;可以直接执行SQL语句。可以多次循环查询问题 前文通过chain去联系数据库并进行操作&#xff1b; 通过链的不断内嵌组合&#xff0c;生成SQL在执行SQL再返回。 初始化 import os from operator import itemgetterimport bs4 from langchain.ch…...

Code Splitting 分包策略

以下是关于分包策略(Code Splitting)的深度技术解析,涵盖原理、策略、工具实现及优化技巧: 一、分包核心价值与底层原理 1. 核心价值矩阵 维度未分包场景合理分包后首屏速度需加载全部资源仅加载关键资源缓存效率任意修改导致全量缓存失效按模块变更频率分层缓存并行加载单…...

AI 开发入门之 RAG 技术

目录 一、从一个简单的问题开始二、语言模型“闭卷考试”的困境三、RAG 是什么—LLM 的现实世界“外挂”四、RAG 的七步流程第一步&#xff1a;加载数据&#xff08;Load&#xff09;第二步&#xff1a;切分文本&#xff08;Chunking&#xff09;第三步&#xff1a;向量化&…...

day36图像处理OpenCV

文章目录 一、图像预处理18 模板匹配18.1模板匹配18.2 匹配方法18.2.1 平方差匹配18.2.2 归一化平方差匹配18.2.3 相关匹配18.2.4 归一化相关匹配18.2.5 相关系数匹配18.2.6 归一化相关系数匹配 18.3 绘制轮廓18.4案例 一、图像预处理 18 模板匹配 18.1模板匹配 模板匹配就是…...

系统与网络安全------弹性交换网络(3)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 STP协议 环路的危害 单点故障 PC之间的互通链路仅仅存在1个 任何一条链路出现问题&#xff0c;PC之间都会无法通信 解决办法 提高网络可靠性 增加冗余/备份链路 增加备份链路后交换网络上产生二层环路 …...

FPGA上实现YOLOv5的一般过程

在FPGA上实现YOLOv5 YOLO算法现在被工业界广泛的应用&#xff0c;虽说现在有很多的NPU供我们使用&#xff0c;但是我们为了自己去实现一个NPU所以在本文中去实现了一个可以在FPGA上运行的YOLOv5。 YOLOv5的开源代码链接为 https://github.com/ultralytics/yolov5 为了在FPGA中…...

verilog和system verilog常用数据类型以及常量汇总

int和unsigned 在 Verilog-2001 中&#xff0c;没有 int 和 unsigned 这样的数据类型。这些关键字是 SystemVerilog 的特性&#xff0c;而不是 Verilog-2001 的一部分。 Verilog-2001 的数据类型 在 Verilog-2001 中&#xff0c;支持的数据类型主要包括以下几种&#xff1a; …...

wordpress学习笔记

P1 P2 P3...

Rust 学习笔记:编程语言的相关概念

Rust 学习笔记&#xff1a;编程语言的相关概念 Rust 学习笔记&#xff1a;编程语言的相关概念动态类型 vs 静态类型动态类型 (Dynamically Typed)静态类型 (Statically Typed)对比示例 强类型 vs 弱类型强类型 (Strongly Typed)弱类型 (Weakly Typed)对比示例 编译型语言 vs 解…...

react nativeWebView跨页面通信

场景 react native项目里&#xff0c;有一些移动端的应用喜欢使用h5来开发&#xff0c;会出现需要跨tab和跨页面通信的场景&#xff0c;可以使用pubsub-js来实现通信。 实现思路 在react native 层实现pubsub的公共API&#xff0c;提供订阅消息、发布消息、取消订阅接口&…...

Python爬虫(3)HTML核心技巧:从零掌握class与id选择器,精准定位网页元素

目录 一、背景与意义‌二、class与id的基础概念与语法规则‌2.1 什么是class与id&#xff1f;‌2.2 核心区别总结 三、应用场景与实战案例‌3.1 场景1&#xff1a;CSS样式管理‌3.2 场景2&#xff1a;JavaScript交互‌3.3 场景3&#xff1a;SEO优化与语义化‌ 四、常见误区与最…...

BGE(BAAI General Embedding)模型详解

BGE&#xff08;BAAI General Embedding&#xff09;模型详解 BGE&#xff08;BAAI General Embedding&#xff09;是北京智源人工智能研究院&#xff08;BAAI&#xff09;推出的通用文本嵌入模型系列&#xff0c;旨在为各种自然语言处理任务提供高质量的向量表示。 一、BGE模…...

【Linux网络】应用层自定义协议与序列化及Socket模拟封装

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

Rust项目GPG签名配置指南

Rust项目GPG签名配置指南 一、环境准备 # 安装Gpg4win&#xff08;Windows&#xff09; winget install -e --id GnuPG.Gpg4win二、密钥生成与配置 # 生成RSA4096密钥 gpg --full-generate-key # 类型选RSA and RSA&#xff0c;长度4096&#xff0c;邮箱填z3266420686202216…...

6.第六章:数据分类的技术体系

文章目录 6.1 数据分类的技术架构6.1.1 数据分类的整体流程6.1.2 数据分类的技术组件6.1.2.1 数据采集与预处理6.1.2.2 特征工程与选择6.1.2.3 分类模型构建6.1.2.4 模型评估与优化6.1.2.5 分类结果应用与反馈 6.2 数据分类的核心技术与算法6.2.1 传统机器学习算法6.2.2 深度学…...

Nginx 反向代理,啥是“反向代理“啊,为啥叫“反向“代理?而不叫“正向”代理?它能干哈?

Nginx 反向代理的理解与配置 User 我打包了我的前端vue项目&#xff0c;上传到服务器&#xff0c;在宝塔面板安装了nginx服务&#xff0c;配置了文件 nginx.txt .运行了项目。 我想清楚&#xff0c;什么是nginx反向代理&#xff1f;是nginx作为一个中介&#xff1f;中间件来集…...

下篇:深入剖析 BLE GATT / GAP / SMP 与应用层(约5000字)

引言 在 BLE 协议栈的最上层,GAP 定义设备角色与连接管理,GATT 构建服务与特征,SMP 负责安全保障,应用层则承载具体业务逻辑与 Profile。掌握这一层,可实现安全可靠的设备发现、配对、服务交互和定制化业务。本文将详解 GAP、GATT、SMP 三大模块,并通过示例、PlantUML 时…...