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

Qt实现文件传输服务器端(图文详解+代码详细注释)

Qt实现文件传输服务器

  • 1、前言
  • 2、服务器
    • 2.1 服务器UI界面
    • 2.2添加网络模块和头文件
    • 2.3、创建服务器对象
    • 2.4 连接有新连接的信号与槽
    • 2.5实现有新连接处理的槽函数
    • 2.6 选择文件按钮实现
      • 2.6.1 连接按钮点击的信号与槽
      • 2.6.2 添加头文件
      • 2.6.3 创建所需对象
      • 2.6.3 选择文件按钮实现
    • 2.7 发送文件按钮实现
    • 2.7.1添加定时器解决粘包问题
    • 2.7.2 连接定时器结束信号与槽
    • 2.7.3定时器结束槽函数实现
  • 3、头文件和.cpp文件
    • 3.1 Widget.h文件
    • 3.2 .cpp文件
  • 4、总结

1、前言

记录自己对于Qt实现文件传输的学习过程,方便自己日后回顾,也可以给别人提供参考借鉴,目录就是实现的过程,大家可以按照目录逐步浏览,也可以点击目录跳转到所需部分,这个是服务器端,客户端在主页另外一篇博客。

2、服务器

2.1 服务器UI界面

在这里插入图片描述

2.2添加网络模块和头文件

在这里插入图片描述

添加完网络模块构建一下,添加头文件
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>

在这里插入图片描述

2.3、创建服务器对象

#define PORT 8000       //端口号QTcpServer *tcpServer;          //创建服务器对象指针
QTcpSocket *tcpSocket;          //通信套接字

在这里插入图片描述

在这里插入图片描述

创建服务器对象,监听连接对象
tcpServer = new QTcpServer(this);           //创建服务器对象
tcpServer->listen(QHostAddress::Any,PORT);          //监听任意ip地址和端口号

在这里插入图片描述

2.4 连接有新连接的信号与槽

创建槽函数
private slots:void newConnectionHandler();        //新连接处理槽函数
连接有新连接的信号和槽函数
connect(tcpServer,&QTcpServer::newConnection,this,&Widget::newConnectionHandler);    //处理新连接

2.5实现有新连接处理的槽函数

鼠标放在函数上,ALT+Enter,点击添加定义

在这里插入图片描述

未连接成功前设置按钮不可按
//设置按钮不可按
ui->selectPushButton->setEnabled(false);        //选择文件按钮不可按
ui->sendPushButton->setEnabled(false);          //发送文件按钮不可按

在这里插入图片描述

新连接槽函数实现
//处理新连接
void Widget::newConnectionHandler()
{//建立Tcp连接tcpSocket = tcpServer->nextPendingConnection();     //取出下一个连接的套接字   //获取ip地址和端口号QString ip = tcpSocket->peerAddress().toString();   //ip地址qint16 Port = tcpSocket->peerPort();                //端口号//显示ip地址和端口号ui->ipLineEdit->setText(ip);            //在ip输入框上显示ui->portLineEdit->setText(QString::number(Port));        //在Port输入框中显示QString connectTemp = QString("[%1:%2] 已连接").arg(ip).arg(Port);     //已连接文本ui->messageTextEdit->setText(connectTemp);          //显示已连接信息//设置文件按钮为可按ui->selectPushButton->setEnabled(true);             //设置选择文件按钮位可按ui->sendPushButton->setEnabled(true);               //设置发送文件按钮位可按
}

2.6 选择文件按钮实现

2.6.1 连接按钮点击的信号与槽

把鼠标放到选择文件的按钮控件上,右键,点击转到槽

在这里插入图片描述

点击clicked()

在这里插入图片描述

2.6.2 添加头文件

在这里插入图片描述

添加QMessageBox是为了弹窗消息框,添加QDebug是为了打印信息

2.6.3 创建所需对象

QFile file;                     //创建文件对象QString fileName;               //文件名字
qint64 fileSize;                //文件大小
qint64 senddFileSize;           //发送文件大小

在这里插入图片描述

2.6.3 选择文件按钮实现

//选择文件按钮
void Widget::on_selectPushButton_clicked()
{QString filePath = QFileDialog::getOpenFileName(this,"open","../");   //准备打开文件的路径//打开的文件路径不为空if(!filePath.isEmpty()){//获取文件信息QFileInfo fileInfo(filePath);       //文件信息fileName = fileInfo.fileName();     //文件名字fileSize = fileInfo.size();         //文件大小senddFileSize = 0;         //发送文件大小为0//以只读打开文件file.setFileName(filePath);     //准备打开的文件bool fileisOk = file.open(QIODevice::ReadOnly);         //以只读形式打开//打开文件失败if(fileisOk==false){QMessageBox::warning(this,"打开文件","打开文件失败");     //显示打开文件失败消息框}//文件路径显示ui->messageTextEdit->setText(filePath);         //显示文件路径ui->selectPushButton->setEnabled(false);       //打开文件成功后选择文件按钮失效ui->sendPushButton->setEnabled(true);          //发送按钮文件生效  }else{QMessageBox::warning(this,"打开文件失败","文件不能为空");      //显示打开文件错误消息框}}

2.7 发送文件按钮实现

跟选择文件一样,转到槽,点击clicked()

2.7.1添加定时器解决粘包问题

添加头文件

在这里插入图片描述

创建定时器对象
QTimer sendFileTimer;           //发送文件定时器

2.7.2 连接定时器结束信号与槽

创建定时器结束处理槽函数
void sendFileTimeoutHandler();          //发送文件结束定时器处理
sendFileTimer = new QTimer(this);           //创建定时器对象
连接定时器结束信号与槽
connect(sendFileTimer,&QTimer::timeout,this,&Widget::sendFileTimeoutHandler); //定时器结束处理       

2.7.3定时器结束槽函数实现

//定时器结束处理
void Widget::sendFileTimeoutHandler()
{sendFileTimer->stop();          //停止定时器char buf[4*1024] = {0};       //缓冲区qint64 bytesRead = file.read(buf, sizeof(buf)); // 读取实际字节数//成功读取到数据if(bytesRead>0){qint64 bytesWritten = tcpSocket->write(buf, bytesRead); // 发送实际读取的字节//发送错误if (bytesWritten == -1) {QMessageBox::warning(this, "错误", "发送失败");return;}senddFileSize += bytesWritten;     //发送的文件大小// 未发送完则继续触发定时器if (senddFileSize < fileSize) {sendFileTimer->start(20);       //20ms触发一次定时器} else {QMessageBox::information(this, "完成", "文件发送完毕");file.close();}}else if(senddFileSize < fileSize){QMessageBox::warning(this, "错误", "文件读取失败");}
}

3、头文件和.cpp文件

3.1 Widget.h文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QFileDialog>
#include <QFileInfo>
#include <QFile>
#include <QMessageBox>
#include <QDebug>
#include <QTimer>#define PORT 8000       //端口号QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void newConnectionHandler();            //新连接处理槽函数void sendFileTimeoutHandler();          //发送文件结束定时器处理void on_selectPushButton_clicked();     //选择文件按钮实现void on_sendPushButton_clicked();       //发送文件按钮实现private:Ui::Widget *ui;QTcpServer *tcpServer;          //创建服务器对象指针QTcpSocket *tcpSocket;          //通信套接字QFile file;                     //创建文件对象QString fileName;               //文件名字qint64 fileSize;                //文件大小qint64 senddFileSize;           //发送文件大小QTimer *sendFileTimer;           //发送文件定时器
};
#endif // WIDGET_H

3.2 .cpp文件

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
//    this->setWindowFlag(Qt::FramelessWindowHint);       //去边框//设置按钮不可按ui->selectPushButton->setEnabled(false);        //选择文件按钮不可按ui->sendPushButton->setEnabled(false);          //发送文件按钮不可按tcpServer = new QTcpServer(this);           //创建服务器对象tcpServer->listen(QHostAddress::Any,PORT);          //监听任意ip地址和端口号sendFileTimer = new QTimer(this);           //创建定时器对象connect(tcpServer,&QTcpServer::newConnection,this,&Widget::newConnectionHandler);    //处理新连接connect(sendFileTimer,&QTimer::timeout,this,&Widget::sendFileTimeoutHandler);        //定时器结束处理
}Widget::~Widget()
{delete ui;
}//处理新连接
void Widget::newConnectionHandler()
{//建立Tcp连接tcpSocket = tcpServer->nextPendingConnection();     //取出下一个连接的套接字//获取ip地址和端口号QString ip = tcpSocket->peerAddress().toString();   //ip地址qint16 Port = tcpSocket->peerPort();                //端口号//显示ip地址和端口号ui->ipLineEdit->setText(ip);            //在ip输入框上显示ui->portLineEdit->setText(QString::number(Port));        //在Port输入框中显示QString connectTemp = QString("[%1:%2] 已连接").arg(ip).arg(Port);     //已连接文本ui->messageTextEdit->setText(connectTemp);          //显示已连接信息//设置文件按钮为可按ui->selectPushButton->setEnabled(true);             //设置选择文件按钮位可按ui->sendPushButton->setEnabled(true);               //设置发送文件按钮位可按}//定时器结束处理
void Widget::sendFileTimeoutHandler()
{sendFileTimer->stop();          //停止定时器char buf[4*1024] = {0};       //缓冲区qint64 bytesRead = file.read(buf, sizeof(buf)); // 读取实际字节数//成功读取到数据if(bytesRead>0){qint64 bytesWritten = tcpSocket->write(buf, bytesRead); // 发送实际读取的字节//发送错误if (bytesWritten == -1) {QMessageBox::warning(this, "错误", "发送失败");return;}senddFileSize += bytesWritten;     //发送的文件大小// 未发送完则继续触发定时器if (senddFileSize < fileSize) {sendFileTimer->start(20);       //20ms触发一次定时器} else {QMessageBox::information(this, "完成", "文件发送完毕");file.close();}}else if(senddFileSize < fileSize){QMessageBox::warning(this, "错误", "文件读取失败");}
}//选择文件按钮
void Widget::on_selectPushButton_clicked()
{QString filePath = QFileDialog::getOpenFileName(this,"open","../");   //准备打开文件的路径//打开的文件路径不为空if(!filePath.isEmpty()){//获取文件信息QFileInfo fileInfo(filePath);       //文件信息fileName = fileInfo.fileName();     //文件名字fileSize = fileInfo.size();         //文件大小senddFileSize = 0;         //发送文件大小为0//以只读打开文件file.setFileName(filePath);     //准备打开的文件bool fileisOk = file.open(QIODevice::ReadOnly);         //以只读形式打开//打开文件失败if(fileisOk==false){QMessageBox::warning(this,"打开文件","打开文件失败");     //显示打开文件失败消息框}//文件路径显示ui->messageTextEdit->setText(filePath);         //显示文件路径ui->selectPushButton->setEnabled(false);       //打开文件成功后选择文件按钮失效ui->sendPushButton->setEnabled(true);          //发送按钮文件生效}else{QMessageBox::warning(this,"打开文件失败","文件不能为空");      //显示打开文件错误消息框}}//发送文件按钮
void Widget::on_sendPushButton_clicked()
{//发送文件信息QString fileMes = QString("%1##%2\n").arg(fileName).arg(fileSize);       //发送文件的名字和大小qint64 fileLength = tcpSocket->write(fileMes.toUtf8().data());     //发送文件长度//发送文件成功if(fileLength > 0){//发送文件的真正内容//距离太久会产生粘包问题//使用定时器解决粘包问题sendFileTimer->start(20);    //间隔20ms触发timeout定时器结束信号}else{QMessageBox::warning(this,"发送文件","发送文件失败");          //显示发送文件失败消息框file.close();           //关闭文件tcpSocket->disconnectFromHost();        //断开连接tcpSocket->close();       //关闭连接}
}

4、总结

以上就是Qt实现文件传输服务器端的整个过程了,浏览过程中,如若发现错误,欢迎大

家指正,有问题的可以评论区留言或者私信。最后,如果大家觉得有所帮助,可以点一

下赞,谢谢大家!未来是未知的,愿大家保持冷静,继续前行!

相关文章:

Qt实现文件传输服务器端(图文详解+代码详细注释)

Qt实现文件传输服务器 1、前言2、服务器2.1 服务器UI界面2.2添加网络模块和头文件2.3、创建服务器对象2.4 连接有新连接的信号与槽2.5实现有新连接处理的槽函数2.6 选择文件按钮实现2.6.1 连接按钮点击的信号与槽2.6.2 添加头文件2.6.3 创建所需对象2.6.3 选择文件按钮实现 2.7…...

记录学习的第二十七天

今天效率低下&#xff0c;只做了一道力扣的每日一题。 看了题解才懂的。下面复述一遍吧。 算法就是越长越合法型滑动窗口。 核心&#xff1a; 如果此时窗口中有c个元素x&#xff0c;此时再进一个x&#xff0c;那么相同数对就增加c个。 如果此时窗口有c个元素x&#xff0c;此…...

docker 安装TDengine 时序数据库

TDengine是一个高性能、分布式a的时序数据库&#xff0c;专为物联网(loT)和大数据分析日设计。使用Docker快速地搭建 TDengine 的开发或测试环境。以下技术指南&#xff0c;帮助您通过Docker Compose 安装并运行TDengine 1.拉取镜像 (3.3.6.0版本) docker pull registry.cn-ha…...

如何更好使用呼叫中心系统和语音机器人

​要更好地使用呼叫中心系统和语音机器人&#xff0c;需要结合两者的优势&#xff0c;实现自动化、智能化、高效率的客户服务与业务运营。以下是优化策略和具体实践方法&#xff1a; 一、呼叫中心系统优化 1. 智能路由与IVR优化 ​ ​智能ACD&#xff08;自动呼叫分配&…...

C复习(主要复习)

指针和数组 指针数组是一个数组&#xff0c;数组的每个元素都是指针。它适用于需要存储多个指针的场景&#xff0c;如字符串数组。数组指针是一个指针&#xff0c;指向一个数组。它适用于需要传递整个数组给函数或处理多维数组的场景。 函数指针&#xff1a;函数指针的定义需要…...

网页五子棋项目测试报告

一、测试概述 网页五子棋项目运用 Java 语言与 Spring 框架开发&#xff0c;具备用户登录注册、人机对战、在线匹配对局、房间邀请对局及积分排行榜等功能。本次测试旨在评估项目各功能的完整性、稳定性与交互性&#xff0c;依据各文章所描述的功能设计和实现细节进行全面测试…...

大模型提示词prompt

系列文章目录 第一章 提示词的引言和指南 文章目录 系列文章目录前言原则1&#xff1a;写清楚具体的说明1、使用分割符2、要求结构化输出3、检查条件是否满足 检查完成任务所需的假设4、少量样例提示给出成功的例子 原则2&#xff1a;给模型足够的时间思考1、给予模型要输出执…...

如何让Agent开发正真可控、可靠?Cursor AI工程化

工程化的目的 不知道你在AI编程的过程中有没有这样的痛点&#xff1f;开发质量不理想、研发进度无法把控… 问题核心在于没有一套属于AI编程的规范&#xff0c;这正是工程化要解决的问题。 如何工程化 参考我们正常研发流程中的步骤&#xff0c;技术方案设计&评审->…...

计算机视觉——基于人工智能视觉注意力的在线广告中评估检测技术

概述 自2023年在线广告行业估计花费了7403亿美元以来&#xff0c;很容易理解为什么广告公司会投入大量资源进行这一特定领域的计算机视觉研究。 尽管这个行业通常较为封闭和保守&#xff0c;但偶尔也会在arxiv等公共存储库中发布一些研究&#xff0c;这些研究暗示了更先进的专…...

opencv函数展示

一、图像基础 I/O 与显示 1.cv2.imread() 2.cv2.imshow() 3. cv2.waitKey() 4. cv2.imwrite() 5. cv2.selectROI() 6. cv2.VideoCapture() 二、颜色空间与转换 1. cv2.cvtColor() 2. cv2.split() 三、阈值处理 1. cv2.threshold() 2. 特殊阈值方法...

Redis 的不同数据结构分别适用于哪些微服务场景

我们一块来分析下Redis 的不同数据结构在微服务场景下的具体应用&#xff1a; 1. String (字符串) 特点: 最基本的数据类型&#xff0c;二进制安全&#xff0c;可以存储任何类型的数据&#xff08;文本、序列化对象、图片等&#xff09;&#xff0c;最大 512MB。支持原子性的…...

用node编写git钩子hooks的示例

关于 git 钩子函数&#xff0c;就是在 git 进行提交的时候触发一些可执行脚本的功能&#xff0c;详情可以看这篇博客【GIT知识】git进阶-hooks勾子脚本_git hooks-CSDN博客&#xff0c;我这里稍微演示一下怎么用 node 编写钩子的脚本 以 pre-commit 钩子为例&#xff0c;会在用…...

RISC-V架构新生态:鸿道Intewell操作系统×全志D1芯片

在全球化技术博弈与自主可控需求的双重驱动下&#xff0c;RISC-V架构正从开源革命走向产业落地。然而&#xff0c;RISC-V生态的成熟不仅需要硬件层面的突破&#xff0c;更需操作系统与芯片的深度协同。鸿道Intewell操作系统与全志D1&#xff08;RISC-V架构&#xff09;芯片的适…...

盈达科技:重新定义GEO优化的技术边界与商业未来​

​ ​​——以硬核技术领跑生成式AI时代的认知主权争夺战​​ ​​01 技术架构&#xff1a;AICC 2.0智能协同中心​​ ​​生成式AI优化的「核动力引擎」​​ 盈达科技独创的​​AICC 2.0&#xff08;自适应-智能-认知-动态响应&#xff09;智能协同中心​​&#xff0c;构建…...

芯片测试工具系统Demo示例

芯片测试工具系统Demo示例 一个简单的芯片测试工具系统Demo示例&#xff0c;包含基础功能和模拟测试流程&#xff0c;使用Python实现&#xff1a; python import time import random import csv from datetime import datetime class VirtualChip: """模…...

从单模态到多模态:五大模型架构演进与技术介绍

前言 1. ResNet — 残差神经网络背景核心问题与解决方案原理模型架构ResNet 系列变体技术创新与影响 2. ViT — Vision Transformer背景核心思想发展历程Transformer的起源&#xff1a;ViT的出现&#xff1a;ViT的进一步发展&#xff1a; 模型架构技术创新与影响 3. Swin Trans…...

基于 Java 的淘宝 API 调用实践:商品详情页 JSON 数据结构解析与重构

一、引言 在电商领域&#xff0c;淘宝拥有海量的商品数据。通过调用淘宝 API 可以获取商品详情页的 JSON 数据&#xff0c;这对于商家进行市场分析、竞品调研等具有重要意义。本文将详细介绍如何使用 Java 调用淘宝 API&#xff0c;获取商品详情页的 JSON 数据&#xff0c;并对…...

Sentinel源码—3.ProcessorSlot的执行过程二

大纲 1.NodeSelectorSlot构建资源调用树 2.LogSlot和StatisticSlot采集资源的数据 3.Sentinel监听器模式的规则对象与规则管理 4.AuthoritySlot控制黑白名单权限 5.SystemSlot根据系统保护规则进行流控 3.Sentinel监听器模式的规则对象与规则管理 (1)Sentinel的规则对象 …...

【C++11】列表初始化、右值引用、完美转发、lambda表达式

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f310; C 语言 上篇文章&#xff1a;unordered_map、unordered_set底层编写 下篇文章&#xff1a;C11&#xff1a;新的类功能、模板的可…...

Spring中IOC的重点理解(笔记)

Spring: 出现在2002左右.解决企业级开发的难度.减轻对项目模块 类与类之间的管理帮助开发人员创建对象,管理对象之间的关系. 补充&#xff1a;什么是OCP原则&#xff1f;&#xff08;面试&#xff09; &#xff08;1&#xff09;是软件七大开发当中最基本的一个原则&#xff…...

数据库系统概论|第三章:关系数据库标准语言SQL—课程笔记4

前言 前面详细介绍了关于SELECT语句的相关使用方法&#xff0c;继续上文的介绍&#xff0c;本文将继续介绍数据查询的其他相关操作&#xff0c;主要包括排序&#xff08;ORDER BY&#xff09;子句、分组&#xff08;GROUP BY&#xff09;子句。与此同时&#xff0c;介绍完单表…...

【1】CICD持续集成-docker本地搭建gitlab代码仓库社区版

‌一、gitlab社区版概述 GitLab社区版&#xff08;Community Edition, CE&#xff09;是一个开源的版本控制系统&#xff0c;适用于个人开发者、中小团队及大型企业。‌ GitLab社区版采用MIT许可证&#xff0c;用户可以免费使用和修改源代码。其主要功能包括代码托管、版本控制…...

Verdi工具使用心得知识笔记(一)

Verdi工具使用知识点提炼 本文来源于移知&#xff0c;具体文档请咨询厚台 一、基础概念 波形依赖 Verdi本身无法生成波形&#xff0c;需配合VCS等仿真工具生成.fsdb文件。核心功能模块 • nTrace&#xff1a;代码调试与追踪 • nSchema&#xff1a;原理图分析 • nState&…...

【25软考网工笔记】第二章 数据通信基础(4)数据编码

目录 一、曼彻斯特编码 1. 以太网 2. 题型(考试过的选择题) 1&#xff09;题目解析 二、差分曼彻斯特编码 三、两种曼彻斯特编码特点 ​编辑 1. 双相码 2. 将时钟和数据包含在信号数据流中 3. 编码效率低 4. 数据速率是码元速率的一半 5. 应用案例 ​编辑 1&…...

【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——USB OTG测试

1&#xff09;实验平台&#xff1a;正点原子ATK-DLMP257B开发板 2&#xff09;浏览产品&#xff1a;https://www.alientek.com/Product_Details/135.html 3&#xff09;全套实验源码手册视频下载&#xff1a;正点原子资料下载中心 第四章 ATK-DLMP257B功能测试——USB OTG测试…...

现代c++获取linux系统磁盘大小

现代c获取linux系统磁盘大小 前言一、命令获取系统磁盘大小二、使用c获取系统磁盘大小三、总结 前言 本文介绍一种使用c获取linux系统磁盘大小的方法 一、命令获取系统磁盘大小 在linux系统中可以使用lsblk命令显示当前系统磁盘大小&#xff0c;如下图所示 lsblk二、使用c获…...

tcp和udp的数据传输过程以及区别

tcp和udp的数据传输过程以及区别 目录 一、数据传输过程 1.1 UDP 数据报服务图 1.2 TCP 字节流服务图 1.3 tcp和udp的区别 1.3.1 连接特性 1.3.2 可靠性 1.3.3 数据传输形式 1.3.4 传输效率与开销 应用场景 一、数据传输过程 1.1 UDP 数据报服务图 这张图展示了 UDP 数据报服务…...

C++项目-衡码云判项目演示

衡码云判项目是什么呢&#xff1f;简单来说就是这是一个类似于牛客、力扣等在线OJ系统&#xff0c;用户在网页编写代码&#xff0c;点击提交后传递给后端云服务器&#xff0c;云服务器将用户的代码和测试用例进行合并编译&#xff0c;返回结果到网页。 项目最大的两个亮点&…...

C 语言中的 volatile 关键字

1、概念 volatile 是 C/C 语言中的一个类型修饰符&#xff0c;用于告知编译器&#xff1a;该变量的值可能会在程序控制流之外被意外修改&#xff08;如硬件寄存器、多线程共享变量或信号处理函数等&#xff09;&#xff0c;因此编译器不应对其进行激进的优化&#xff08;如缓存…...

mysql表类型查询

普通表 SELECT table_schema AS database_name,table_name FROM information_schema.tables WHERE table_schema NOT IN (information_schema, mysql, performance_schema, sys)AND table_type BASE TABLEAND table_name NOT IN (SELECT DISTINCT table_name FROM informatio…...

JavaScript事件循环

目录 JavaScript 执行机制与事件循环 一、同步与异步代码 1. 同步代码&#xff08;Synchronous Code&#xff09; 2. 异步代码&#xff08;Asynchronous Code&#xff09; 二、事件循环&#xff08;Event Loop&#xff09; 1. 核心组成 2. 事件循环基本流程 3. 运行机制…...

Linux》》bash 、sh 执行脚本

通常使用shell去运行脚本&#xff0c;两种方法 》bash xxx.sh 或 bash “xxx.sh” 、sh xxx.sh 或 sh “xxx.sh” 》bash -c “cmd string” 引号不能省略 我们知道 -c 的意思是 command&#xff0c;所以 bash -c 或 sh -c 后面应该跟一个 command。...

Git完全指南:从入门到精通版本控制 ------- Git 查看提交历史(8)

Git提交历史深度解析&#xff1a;从代码考古到精准回退 前言 在软件开发的生命周期中&#xff0c;提交历史是团队协作的时空胶囊。Git作为分布式版本控制系统&#xff0c;其强大的历史追溯能力可帮助开发者&#xff1a; 精准定位引入Bug的提交分析代码演进趋势恢复误删的重要…...

精益数据分析(2/126):解锁数据驱动的商业成功密码

精益数据分析&#xff08;2/126&#xff09;&#xff1a;解锁数据驱动的商业成功密码 大家好&#xff01;在如今这个数据爆炸的时代&#xff0c;数据就像一座蕴含无限宝藏的矿山&#xff0c;等待着我们去挖掘和利用。最近我在深入研读《精益数据分析》这本书&#xff0c;收获了…...

【ssti模板注入基础】

一、ssti模板注入简介 二、模板在开发中的应用 为什么要使用模板 为什么要用模板来提升效率&#xff1a; 不管我们输入什么&#xff0c;有一部分内容都是不会变的 除了内容之外其他都不会变&#xff0c;如果我们有成千上万的页面&#xff0c;如果不用模板&#xff0c;就算复…...

如何在 Kali 上解决使用 evil-winrm 时 Ruby Reline 的 quoting_detection_proc 警告

在使用 Kali Linux 运行 Ruby 工具&#xff08;例如 evil-winrm&#xff09;时&#xff0c;你可能会遇到以下警告&#xff1a; Warning: Remote path completions is disabled due to ruby limitation: undefined method quoting_detection_proc for module Reline这个警告会导…...

从零开始搭建PyTorch环境(支持CUDA)

从零开始搭建PyTorch环境&#xff08;支持CUDA&#xff09; 本文将详细介绍如何在Windows系统上为RTX 3050显卡配置支持CUDA的PyTorch环境。 环境准备 本教程基于以下环境&#xff1a; 显卡&#xff1a;NVIDIA RTX 3050操作系统&#xff1a;WindowsPython版本&#xff1a;3.1…...

【扩散模型连载 · 第 2 期】逆向扩散建模与神经网络的角色

上期回顾 我们在第 1 期中介绍了 正向扩散过程&#xff08;Forward Process&#xff09;&#xff0c;并用 CIFAR-10 图像演示了加噪过程&#xff1a; 正向过程是固定的&#xff0c;无需训练&#xff0c;但我们感兴趣的是&#xff1a;如何从纯噪声一步步“还原”出真实图像&…...

Mysql约束

约束其实就是创建表的时候给表的某些列加上限制条件。 主键约束和自增长约束比较重要 一、Mysql约束-主键约束 简介 指定的主键不能重复也不可以出现空值 1.添加单列主键 语法1&#xff1a;create table 表名&#xff08;字段名 数据类型 primary key&#xff09;; 点开…...

力扣热题100—滑动窗口(c++)

3.无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 unordered_set<char> charSet; // 用于保存当前窗口的字符int left 0; // 窗口左指针int maxLength 0; // 最长子串的长度for (int right 0; right < s.siz…...

Linux网络编程第一课:深入浅出TCP/IP协议簇与网络寻址系统

知识点1【网络发展简史】 **网络节点&#xff1a;**路由器和交换机组成 交换机的作用&#xff1a;拓展网络接口 路由&#xff1a;网络通信路径 1、分组交换 分组的目的&#xff1a; 数据量大&#xff0c;不能一次型传输&#xff0c;只能分批次传输&#xff0c;这里的每一批…...

论文阅读笔记:Generative Modeling by Estimating Gradients of the Data Distribution

1、参考来源 论文《Generative Modeling by Estimating Gradients of the Data Distribution》 来源&#xff1a;NeurIPS 2019 论文链接&#xff1a;https://arxiv.org/abs/1907.05600 参考链接&#xff1a; 【AI知识分享】真正搞懂扩散模型Score Matching一定要理解的三大核心…...

C++零基础实践教程 函数 数组、字符串与 Vector

模块四&#xff1a;函数 (代码复用与模块化) 随着程序变得越来越复杂&#xff0c;把所有代码都堆在 main 函数里会变得难以管理和阅读。函数 (Function) 允许你将代码分解成逻辑上独立、可重用的块。这就像把一个大任务分解成几个小任务&#xff0c;每个小任务交给一个专门的“…...

照片处理工具:基于HTML与JavaScript实现详解

在当今数字时代,处理照片已成为日常需求。 本文将详细介绍一个基于HTML和JavaScript的照片处理工具的实现原理,这个工具可以调整图片尺寸、格式,并精确控制输出文件大小。 实现如下,不需要任何编辑器,txt文本、浏览器就行!! 工具功能概述 这个照片处理工具提供以下核心…...

MyBatis-OGNL表达式

介绍 OGNL&#xff08;Object-Graph Navigation Language&#xff09;是一种强大的表达式语言&#xff0c;用于获取和设置Java对象图中的属性。在MyBatis中&#xff0c;OGNL常用于动态SQL构建&#xff0c;如条件判断、循环等。以下是关于OGNL表达式的整合信息&#xff0c;包括…...

Web Worker在uniapp鸿蒙APP中的深度应用

文章目录 一、Web Worker核心概念解析1.1 什么是Web Worker&#xff1f;1.2 为什么在鸿蒙APP中使用Web Worker&#xff1f;1.3 性能对比实测 二、uniapp中的Web Worker完整实现2.1 基础配置步骤2.1.1 项目结构准备2.1.2 鸿蒙平台特殊配置 2.2 Worker脚本编写规范2.3 主线程通信…...

无人机故障冗余设计技术要点与难点!

一、技术要点 1. 冗余架构设计 硬件冗余&#xff1a;关键部件&#xff08;飞控、电机、电池、通信模块&#xff09;采用双余度或三余度设计&#xff0c;例如&#xff1a; 双飞控系统&#xff1a;主飞控失效时&#xff0c;备用飞控无缝接管。 电机动力冗余&#xff1a;六轴无…...

MySQL数据库表查询

测试表company.employee5 mysql> create database company; #创建一个库&#xff1b; 创建一个测试表: mysql> CREATE TABLE company.employee5(id int primary key auto_increment not null,name varchar(30) not null,sex enum(male,female) default male not null,hi…...

ADB的安装及抓取日志(2)

三、ADB抓取日志 在使用ADB抓取日志前&#xff0c;首先要保证电脑已经安装并配置ADB&#xff0c;在上一节已经验证完成。连接设备&#xff1a;可通过USB或者WI-FI&#xff0c;将安卓设备与电脑连接&#xff0c;并启用USB调试模式&#xff0c;此处我选择的是通过电脑与安卓设备…...

【C++】 —— 笔试刷题day_17

一、小乐乐改数字 题目解析 这道题&#xff0c;它们给定一个数&#xff0c;我们要对它进行修改&#xff1b;如果某一位是奇数&#xff0c;就把它变成1,&#xff1b;如果是偶数&#xff0c;就把它变成0&#xff1b; 让我们输出最后得到的数。 算法思路 这道题&#xff0c;总体…...