Qt项目:网络1
文章目录
- 项目:网路
- 项目1:主机信息查询
- 1.1 QHostInfo类和QNetworkInterface类
- 1.2 主机信息查询项目实现
- 项目2:基于HTTP的网络应用程序
- 2.1 项目中用到的函数详解
- 2.2 主要源码
项目:网路
项目1:主机信息查询
使用QHostInfo类和QNetworkInterface类可以获取主机的一些网络信息,如IP地址1和MAC地址2。
在Qt项目里使用Qt Network模块,需要在项目配置文件(.pro 文件)中增加一条配置语句:
QT += network
1.1 QHostInfo类和QNetworkInterface类
QHostInfo类常用函数
QHostInfo类可以根据主机名获取主机的IP地址,或者通过IP地址获取主机名。
- [static] QString QHostInfo::localHostName():返回本机主机名;
- [static] QString QHostInfo::localDomainName():返回本机域名系统(domain name system,DNS)域名;
- [static] QHostInfo QHostInfo::fromName(const QString &name):返回指定主机名的IP地址;
- [static] int QHostInfo::lookupHost(const QString &name, QObject *receiver, const char *member):以异步的方式根据主机名查找主机的IP地址,并返回一个表示本次查找的ID,可用作abortHostLookup()函数的参数;
- [static] void QHostInfo::abortHostLookup(int id):使用 lookupHost() 返回的 ID 终止主机查找。
- QList<QHostAddress> QHostInfo::addresses() const:返回与hostName()对应主机关联的IP地址列表;
- QString QHostInfo::hostName() const:返回通过IP地址查找到的主机名;
QNetworkInterface类常用的函数
QNetworkInterface类可以获得运行程序的主机名的所用IP地址和网络接口列表。
- [static] QList QNetworkInterface::allAddresses():返回主机上所有IP地址的列表(如果不需要知道子网掩码和广播地址);
- [static] QList QNetworkInterface::allInterfaces():返回主机上所有网络接口列表(一个网络接口可能包含多个IP地址,每个IP地址与掩码或广播地址关联);
- QList QNetworkInterface::addressEntries() const:返回网络接口的IP地址列表,包括子网掩码和广播地址;
- QString QNetworkInterface::hardwareAddress() const:返回接口的低级硬件地址,以太网里就是MAC地址;
- bool QNetworkInterface::isValid() const:如果接口信息有效就返回true;
- QNetworkInterface::InterfaceType QNetworkInterface::type() const:返回网络接口的类型;
1.2 主机信息查询项目实现
- 显示本机地址信息
//获取本机主机名和IP地址按钮
void Widget::on_btnGetHostInfo_clicked()
{ui->plainTextEdit->clear();QString hostName = QHostInfo::localHostName(); //本机主机名qDebug()<<hostName;ui->plainTextEdit->appendPlainText("HostName:"+hostName+"\n");QHostInfo hostInfo = QHostInfo::fromName(hostName); //本机IP地址QList<QHostAddress> addrList = hostInfo.addresses();//IP地址列表if(addrList.isEmpty()) return;foreach(QHostAddress host, addrList){bool show = ui->checkBox_OnlyIPV4->isChecked(); //只显示ipv4//Returns the network layer protocol of the host address.show = show ? (host.protocol() == QAbstractSocket::IPv4Protocol):true;if(show){ui->plainTextEdit->appendPlainText("protool:"+protocolName(host.protocol()));//协议ui->plainTextEdit->appendPlainText("HostIPAdddress:"+host.toString());ui->plainTextEdit->appendPlainText(QString("isGolbal() = %1\n").arg(host.isGlobal()));}}
}
protocol()函数:返回主机地址的网络层协议。
QAbstractSocket::NetworkLayerProtocol QHostAddress::protocol() const
Returns the network layer protocol of the host address.
isGlobal()函数:如果地址是 IPv4 或 IPv6 全局地址,则返回 true,否则返回 false。全局地址是不为特殊目的(如环回或多播)或未来目的保留的地址。
bool QHostAddress::isGlobal() const
Returns true if the address is an IPv4 or IPv6 global address, false otherwise. A global address is an address that is not reserved for special purposes (like loopback or multicast) or future purposes.
自定义函数protocolName(),通过协议类型返回协议名称字符串。
//通过协议类型返回协议名称字符串
QString Widget::protocolName(QAbstractSocket::NetworkLayerProtocol protocol)
{switch (protocol) {case QAbstractSocket::IPv4Protocol:return "IPV4";case QAbstractSocket::IPv6Protocol:return "IPV6";case QAbstractSocket::AnyIPProtocol:return "Any Internet Protocol";default:return "Unknown NetWork Layer Protocol";}
}
- 查找主机地址信息
[static] int QHostInfo::lookupHost(const QString &name, QObject *receiver, const char *member): name表示主机名的字符串,可以是主机名、域名或IP地址;receive和member指定接收者和槽函数名称。
//查找域名的IP地址
void Widget::on_btnLookkup_clicked()
{ui->plainTextEdit->clear();QString hostName = ui->comboBox->currentText(); //读取主机名ui->plainTextEdit->appendPlainText("Searching for host information:"+hostName+"\n");QHostInfo::lookupHost(hostName, this,SLOT(do_lookedUpHostInfo(QHostInfo)));
}//查找主机信息的槽函数
void Widget::do_lookedUpHostInfo(const QHostInfo &host)
{QList<QHostAddress> addrList = host.addresses(); //获取主机地址列表if(addrList.isEmpty())return;foreach(QHostAddress host, addrList){bool show = ui->checkBox_OnlyIPV4->isChecked(); //只显示ipv4//Returns the network layer protocol of the host address.show = show ? (host.protocol() == QAbstractSocket::IPv4Protocol):true;if(show){ui->plainTextEdit->appendPlainText("protool:"+protocolName(host.protocol()));//协议ui->plainTextEdit->appendPlainText(host.toString());ui->plainTextEdit->appendPlainText(QString("isGolbal() = %1\n").arg(host.isGlobal()));}}
}
- QNetworkInterface类的使用
//根据枚举值返回字符串
QString Widget::interfaceType(QNetworkInterface::InterfaceType type)
{switch(type){case QNetworkInterface::Unknown:return "Unkown";case QNetworkInterface::Loopback:return "Loopback";case QNetworkInterface::Ethernet:return "Etherent";case QNetworkInterface::Wifi:return "Wifi";default:return "Other type";}
}//allInterfaces()
void Widget::on_btnAllInterface_2_clicked()
{ui->plainTextEdit->clear();QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();//网络接口列表foreach(QNetworkInterface interface,list){if(!interface.isValid())continue;
// The name of the device
// Hardware devices
// Interface type
// Subnet mask
// broadcast addressui->plainTextEdit->appendPlainText("The name of the device:"+interface.humanReadableName());ui->plainTextEdit->appendPlainText("Hardware devices:"+interface.hardwareAddress());ui->plainTextEdit->appendPlainText("Interface type:"+interfaceType(interface.type()));QList<QNetworkAddressEntry> entryList = interface.addressEntries();//地址列表foreach(QNetworkAddressEntry entry, entryList){ui->plainTextEdit->appendPlainText(" IP Address:"+entry.ip().toString());ui->plainTextEdit->appendPlainText(" Subnet mask:"+entry.netmask().toString());ui->plainTextEdit->appendPlainText(" broadcast address:"+entry.broadcast().toString()+"\n");}}
}//alladdress
void Widget::on_btnAllAddress_clicked()
{ui->plainTextEdit->clear();QList<QHostAddress> addrelist = QNetworkInterface::allAddresses();//IP地址列表if(addrelist.isEmpty()) return;foreach(QHostAddress host, addrelist){bool show = ui->checkBox_OnlyIPV4->isChecked();show = show ? (host.protocol() == QAbstractSocket::IPv4Protocol):true;if(show){ui->plainTextEdit->appendPlainText("protocol:"+protocolName(host.protocol()));ui->plainTextEdit->appendPlainText("IP Address:"+host.toString());ui->plainTextEdit->appendPlainText(QString("isGrobal() = %1\n").arg(host.isGlobal()));}}
}
Loopback:
回送地址(Loopback Address)是本机回送地址(127.X.X.X),即主机IP堆栈内部的IP地址,主要用于网络软件测试以及本地机进程间通信。因此,无论什么程序,一旦使用回送地址发送数据,协议软件会立即将其返回,不进行任何网络传输。127.0.0.1是回送地址,又指本地机,一般用来测试使用。
项目2:基于HTTP的网络应用程序
QNetworkRequest 类通过 URL 发起网络协议请求,其也保存网络请求的信息,目前支持 HTTP、
FTP 和本地文件 URL 的下载或上传。
QNetworkAccessManager 类用于协调网络操作,在 QNetworkRequest 发起网络请求后,
QNetworkAccessManager 负责发送网络请求,以及创建网络响应。
QNetworkReply 类表示网络请求的响应,由 QNetworkAccessManager 在发送网络请求后创建网
络响应。QNetworkReply 提供的信号 finished()、readyRead()、downloadProgress()可用于监测网络响
应的执行情况,从而进行相应的操作。
2.1 项目中用到的函数详解
-
clearButtonEnabled : bool
此属性用于保存行编辑在不为空时是否显示清除按钮。
如果启用,行编辑在包含一些文本时会显示一个尾随清除按钮,否则,行编辑不会显示清除按钮(默认值)。 -
默认路径按钮功能:
- [static] QString QDir::currentPath()
返回应用进程当前目录的绝对路径。当前目录是使用 QDir::setCurrent() 设置的最后一个目录,或者,如果从未调用过,则为父进程启动此应用进程的目录。 - bool QDir::mkdir(const QString &dirName) const
创建一个名为 dirName 的子目录。
- 下载按钮功能:
- QString QString::trimmed() const
返回一个字符串,该字符串删除了开头和结尾的空格。 - [static] QUrl QUrl::fromUserInput(const QString &userInput)
从用户提供的 userInput 字符串返回有效的 URL(如果可以扣除)。如果不可能,则返回无效的 QUrl()。 - QString QUrl::errorString() const
如果修改此 QUrl 对象的最后一个操作遇到解析错误,则返回错误消息。如果未检测到错误,则此函数返回一个空字符串,isValid() 返回 true。 - QString QUrl::fileName(QUrl::ComponentFormattingOptions options = FullyDecoded) const
返回文档名,不包括目录路径。 - bool QFile::remove()
删除 fileName() 指定的文档。如果成功,则返回 true;否则返回 false。文档在删除之前已关闭。 - QNetworkReply *QNetworkAccessManager::get(const QNetworkRequest &request)
发布一个请求以获取目标请求的内容,并返回一个新的 QNetworkReply 对象,该对象打开以供读取,每当新数据到达时,该对象都会发出 readyRead() 信号。将下载内容以及相关的标题。 - [signal] void QIODevice::readyRead()
每当有新数据可用时,此信号就会发出一次从设备的当前读取信道读取。只有当有新数据可用时,它才会再次发出,例如,当新的网络数据有效负载到达您的网络套接字时,或者当新的数据块附加到您的设备时。 - [signal] void QNetworkReply::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
发出此信号以指示此网络请求的下载部分的进度(如果有)。如果没有与此请求关联的下载,则此信号将发出一次,其中 0 作为 bytesReceived 和 bytesTotal 的值。 - [signal] void QNetworkReply::finished()
当回复完成处理时,将发出此信号。发出此信号后,回复的数据或元数据将不再更新。
- 读取下载数据
-
qint64 QIODevice::write(const char *data, qint64 maxSize)
将数据中最多 maxSize 字节的数据写入设备。返回实际写入的字节数,如果发生错误,则返回 -1。 -
QByteArray QIODevice::readAll()
从设备读取所有剩余数据,并将其作为字节数组返回。
2.2 主要源码
头文件
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QNetworkAccessManager>
#include <QFile>
#include <QMessageBox>
#include <QIODevice>
#include <QNetworkReply>
#include <QDesktopServices>
#include <QFileInfo>
#include <QUrl>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECT
private:QNetworkAccessManager networkManager; //网络管理QNetworkReply *reply; //网络响应QFile *downloadedFile; //下载保存的临时文件
public:explicit Widget(QWidget *parent = nullptr);~Widget();
private slots:void do_finished();void do_readyRead();void do_downloadProgress(qint64 bytesRead, qint64 totalBytes);void on_btnDownload_clicked();void on_btnDefaultPath_clicked();void on_editURL_textChanged(const QString &arg1);private:Ui::Widget *ui;
};#endif // WIDGET_H
源文件
#include "widget.h"
#include "ui_widget.h"#include <QDir>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);
//clearButtonEnabled : bool
//This property holds whether the line edit displays a clear button when it is not empty.
//If enabled, the line edit displays a trailing clear button when it contains some text,
// otherwise the line edit does not show a clear button (the default).ui->editURL->setClearButtonEnabled(true);this->setLayout(ui->verticalLayout);
}Widget::~Widget()
{delete ui;
}void Widget::do_finished()
{//网络响应结束QFileInfo fileInfo(downloadedFile->fileName()); //获取下载文件的文件名downloadedFile->close();delete downloadedFile; //删除临时文件reply->deleteLater(); //由主事件循环删除此文件对象if(ui->checkBoxOpen->isChecked()){QDesktopServices::openUrl(QUrl::fromLocalFile(fileInfo.absoluteFilePath()));}ui->btnDownload->setEnabled(true);
}void Widget::do_readyRead()
{//读取下载数据downloadedFile->write(reply->readAll());
// qint64 QIODevice::write(const char *data, qint64 maxSize)
// Writes at most maxSize bytes of data from data to the device.
// Returns the number of bytes that were actually written,
// or -1 if an error occurred.
// QByteArray QIODevice::readAll()
// Reads all remaining data from the device, and returns it as a byte array.}void Widget::do_downloadProgress(qint64 bytesRead, qint64 totalBytes)
{//下载进度ui->progressBar->setMaximum(totalBytes);//Holds the total amount of data to download in bytes.ui->progressBar->setValue(bytesRead);
}//默认了路径 按钮
void Widget::on_btnDefaultPath_clicked()
{
// [static] QString QDir::currentPath()
// Returns the absolute path of the application's current directory.
// The current directory is the last directory set with QDir::setCurrent() or,
// if that was never called,
// the directory at which this application was started at by the parent process.QString curPath = QDir::currentPath(); //返回当前绝对路径给QString变量QDir dir(curPath); //定义QDir变量QString sub = "temp";
// bool QDir::mkdir(const QString &dirName) const
// Creates a sub-directory called dirName.dir.mkdir(sub); //当前路径下创立名为sub的文件夹ui->editPath->setText(curPath+"/"+sub+"/"); //设置lineedit的文字
}//下载按钮,开始下载
void Widget::on_btnDownload_clicked()
{
// QString QString::trimmed() const
// Returns a string that has whitespace removed from the start and the end.QString urlSpec = ui->editURL->text().trimmed(); //将editURL中的文字给QString变量赋值//urlspec判空if(urlSpec.isEmpty()){QMessageBox::information(this,"error","Please specify the download address");return;}
// [static] QUrl QUrl::fromUserInput(const QString &userInput)
// Returns a valid URL from a user supplied userInput string if one can be deducted.
// In the case that is not possible, an invalid QUrl() is returned.QUrl newUrl = QUrl::fromUserInput(urlSpec); //从urlSpaec里获取url//newurl判有效if(!newUrl.isValid()){
// QString QUrl::errorString() const
// Returns an error message if the last operation that modified this QUrl object ran into a parsing error.
// If no error was detected,
// this function returns an empty string and isValid() returns true.QString info = "The URL is invalid:"+urlSpec+"\n error:"+newUrl.errorString();QMessageBox::information(this,"error",info);return;}QString tempDir = ui->editPath->text().trimmed(); //临时目录if(tempDir.isEmpty()){QMessageBox::information(this,"error","Please specify the download address");return;}QString fullFileName = tempDir + newUrl.fileName(); //文件名
// QString QUrl::fileName(QUrl::ComponentFormattingOptions options = FullyDecoded) const
// Returns the name of the file, excluding the directory path.if(QFile::exists(fullFileName)){ //如果文件存在QFile::remove(fullFileName); //删除文件
// bool QFile::remove()
// Removes the file specified by fileName(). Returns true if successful; otherwise returns false.
// The file is closed before it is removed.}downloadedFile = new QFile(fullFileName); //创建临时文件if(!downloadedFile->open(QIODevice::WriteOnly)){QMessageBox::information(this,"error","Temporary file open error");}ui->btnDownload->setEnabled(false);//发送网络请求,创建网络相应reply = networkManager.get(QNetworkRequest(newUrl)); //网络响应从网络管理里面获取网络请求
// QNetworkReply *QNetworkAccessManager::get(const QNetworkRequest &request)
// Posts a request to obtain the contents of the target request and
// returns a new QNetworkReply object opened for reading
// which emits the readyRead() signal whenever new data arrives.
// The contents as well as associated headers will be downloaded.
// QObject *QObject::parent() const
// Returns a pointer to the parent object.connect(reply, SIGNAL(readyRead()), this, SLOT(do_readyRead()));connect(reply, SIGNAL(downloadProgress(qint64,qint64)),this, SLOT(do_downloadProgress(qint64,qint64)));connect(reply, SIGNAL(finished()), this, SLOT(do_finished()));
// [signal] void QIODevice::readyRead()
// This signal is emitted once every time new data is available for
// reading from the device's current read channel.
// It will only be emitted again once new data is available,
// such as when a new payload of network data has arrived on your network socket,
// or when a new block of data has been appended to your device.
// [signal] void QNetworkReply::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
// This signal is emitted to indicate the progress of the download part of
// this network request, if there's any. If there's no download associated with this request,
// this signal will be emitted once with 0 as the value of both bytesReceived and bytesTotal.
// [signal] void QNetworkReply::finished()
// This signal is emitted when the reply has finished processing.
// After this signal is emitted, there will be no more updates to the reply's data or metadata.
}void Widget::on_editURL_textChanged(const QString &arg1)
{Q_UNUSED(arg1);ui->progressBar->setMaximum(100);ui->progressBar->setValue(0);
}
IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。 ↩︎
MAC地址(英语:Media Access Control Address),直译为媒体存取控制位址,也称为局域网地址(LAN Address),MAC位址,以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。在OSI模型中,第三层网络层负责IP地址,第二层数据链路层则负责MAC位址。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址。 ↩︎
相关文章:

Qt项目:网络1
文章目录 项目:网路项目1:主机信息查询1.1 QHostInfo类和QNetworkInterface类1.2 主机信息查询项目实现 项目2:基于HTTP的网络应用程序2.1 项目中用到的函数详解2.2 主要源码 项目:网路 项目1:主机信息查询 使用QHostI…...

软件测试有哪些常用的测试方法?
软件测试是软件开发过程中重要组成部分,是用来确认一个程序的质量或者性能是否符合开发之前提出的一些要求。软件测试的目的有两方面,一方面是确认软件的质量,另一方面是提供信息,例如,给开发人员或者程序经理反馈意见…...

【C语言基础】:深入理解指针(一)
文章目录 一、内存和地址1. 内存2. 如何理解编址 二、指针变量和地址2.1 取地址操作符(&)2.2 指针变量和解引用操作符(*)2.2.1 指针变量2.2.2 如何拆解指针变量2.2.3 解引用操作符 2.3 指针变量的大小 三、指针变量类型的意义3.1 指针的解引用3.2 指针 - 整数3.3 void*指针…...

单点故障解决方案之Smart Link与Monitor Link
-SmartLink技术,创建Smart Link 组。在该组中,加入两个端口。其中1个端口是主端口,也称之为Master端口。另外1个端口是备份端口:也称之为 Slave 端口。 -Monitor Link 组也称之为“监控链路组,由上行端口和下行端口共同组成。下行…...
QT之QSharedMemory共享内存
QSharedMemory是qt提供对共享内存操作的类,主要用来对内存卡写数据和读数据。 常用api: 1、void QSharedMemory::setKey(const QString &key) 为共享内存设置键值。如何当前的内存共享对象已经链接到底层的共享内存段(isAttached)&…...

string 类 经典习题之数字字符相加
题目: 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 题目来源࿱…...
通讯录——C语言实现
头文件Contact.h #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #pragma once #define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30//表示一个人的信息 //struct…...

优思学院|3步骤计算出Cpk|学习Minitab
在生产和质量管理中,准确了解和控制产品特性至关重要。一个关键的工具是Cpk值,它是衡量生产过程能力的重要指标。假设我们有一个产品特性的规格是5.080.02,通过收集和分析过程数据,我们可以计算出Cpk值,进而了解生产过…...
【Java编程进阶之路 06】深入探索:JDK、JRE与JVM的关系与差异
JDK、JRE与JVM:揭开Java运行环境的神秘面纱 在Java开发者的日常工作中,JDK、JRE和JVM这三个概念是不可或缺的。它们构成了Java应用程序的运行环境,但很多初学者可能对这三者的关系和差异感到困惑。本文旨在详细解析JDK、JRE和JVM之间的关系&…...
Linux中的touch命令
在Linux中,touch命令主要用于创建空的文件或者更新已存在文件的时间戳。下面是 touch命令的使用方式和示例说明: 创建空文件 要创建一个空文件,可以使用 touch命令并指定文件名,如下所示: touch new_fi…...

智能驾驶规划控制理论学习-基于采样的规划方法
目录 一、基于采样的规划方法概述 二、概率路图(PRM) 1、核心思想 2、实现流程 3、算法描述 4、节点连接处理 5、总结 三、快速搜索随机树(RRT) 1、核心思想 2、实现流程 3、总结 4、改进RRT算法 ①快速搜索随机图&a…...

二叉树——二叉树所有路径
二叉树所有路径 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [1,2,3,null,5] 输出:["1->2->5","1-…...
算法训练营day38(补),动态规划6
package main func max(a, b int) int { if a > b { return a } return b } 背包最大重量为4。 物品为: 重量价值物品0115物品1320物品2430 每件商品都有无限个! 问背包能背的物品最大价值是多少? func package03(weight, value []…...
【java、微服务、nacos】nacos服务分级存储模型
Nacos服务分级存储模型 ① 一级是服务,例如userservice ②二级是集群,例如杭州或上海 ③ 三级是实例,例如杭州机房的某台部署了userservice的服务器 配置实例集群属性 改变服务的yml文件 spring:cloud:nacos:discovery:cluster-name: H…...
共享旅游卡:打开0费用旅游新纪元,探索40+精彩线路
随着现代生活节奏的加快,旅游成为了许多人释放压力、寻求乐趣的方式。然而,面对琳琅满目的旅游线路和不断上涨的旅游费用,许多人望而却步。 今天,我们要为您介绍一种颠覆传统旅游方式的创新产品——共享旅游卡。它不仅能让您以0费…...

MQTT协议解析:揭秘固定报头、可变报头与有效载荷的奥秘
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种轻量级的通讯协议,常用于远程传感器和控制设备的通讯。MQTT协议基于发布/订阅模式,为大量计算能力有限且工作在低带宽、不可靠网络环境中的设备…...

备战蓝桥杯---树形DP基础3
上一次我们讲了二叉苹果树,现在我们加一点难度,从二叉变成了多叉苹果树。 这样子我们就不可以直接按照上次的方法DP,我们其实可以发现,我们可以用类似背包的思想求解,这就是所谓的树上背包。 我们先加进第一个儿子来…...

IEEE Transactions on Industrial Electronics工业电子TIE修改稿注意事项及提交须知
一、背景 兔年末投了一篇TIE,手稿初次提交的注意事项也整理成了博客IEEE Transactions on Industrial Electronics工业电子TIE论文投稿须知,获得了许多点赞和收藏。最近也收到了审稿结果,给的意见是大修major revision,总之只要不…...
c#委托的三种实现方式
委托是实质一个类,主要目的是将方法当作参数进行传递。 委托是.NET编程的精髓之一,在日常编程中经常用到,在C#中实现委托主要有Func、Action、delegate三种方式,本节主要就这三种委托的用法通过实例展开讲解。 Func用法解析 【F…...
c/c++|红黑树|分析应用|锚点
红黑树是一种自平衡的二叉查找树,它保持着良好的平衡,能够在插入和删除等操作后通过一系列旋转和重新着色操作来保持树的平衡。这种平衡性质使得红黑树在搜索、插入和删除等操作的平均和最坏情况下的时间复杂度都是O(log n)。以下是红黑树的一些关键特性…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...