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 主机信息查询项目实现

  1. 显示本机地址信息
//获取本机主机名和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";}
}
  1. 查找主机地址信息

[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()));}}
}
  1. 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 项目中用到的函数详解

  1. clearButtonEnabled : bool
    此属性用于保存行编辑在不为空时是否显示清除按钮。
    如果启用,行编辑在包含一些文本时会显示一个尾随清除按钮,否则,行编辑不会显示清除按钮(默认值)。

  2. 默认路径按钮功能:

  • [static] QString QDir::currentPath()
    返回应用进程当前目录的绝对路径。当前目录是使用 QDir::setCurrent() 设置的最后一个目录,或者,如果从未调用过,则为父进程启动此应用进程的目录。
  • bool QDir::mkdir(const QString &dirName) const
    创建一个名为 dirName 的子目录。
  1. 下载按钮功能:
  • 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()
    当回复完成处理时,将发出此信号。发出此信号后,回复的数据或元数据将不再更新。
  1. 读取下载数据
  • 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);
}

  1. IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。 ↩︎

  2. MAC地址(英语:Media Access Control Address),直译为媒体存取控制位址,也称为局域网地址(LAN Address),MAC位址,以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。在OSI模型中,第三层网络层负责IP地址,第二层数据链路层则负责MAC位址。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址。 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/266369.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Windows部署TortoiseSVN客户端并实现公网连接内网VisualSVN服务端

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统&#xff0c;它与Apache Subversion&#xff08;SVN&#xff09;集成在一起&#xff0c;提供了一个用户友好的界面&#xff0c;方便用…

CDH6.3.1离线安装

一、从官方文档整体认识CDH 官方文档地址如下&#xff1a; CDH Overview | 6.3.x | Cloudera Documentation CDH是Apache Hadoop和相关项目中最完整、测试最全面、最受欢迎的发行版。CDH提供Hadoop的核心元素、可扩展存储和分布式计算&#xff0c;以及基于Web的用户界面和重…

打造去中心化透明储蓄罐:Solidity智能合约的又一实践

一、案例背景 传统的储蓄罐通常是由个人或家庭使用&#xff0c;用于存放硬币或小额纸币。然而&#xff0c;这样的储蓄罐缺乏透明性&#xff0c;用户无法实时了解储蓄情况&#xff0c;也无法确保资金的安全性。 通过Solidity智能合约&#xff0c;我们可以构建一个去中心化…

C语言-简单实现单片机中的malloc示例

概述 在实际项目中&#xff0c;有些单片机资源紧缺&#xff0c;需要mallloc内存&#xff0c;库又没有自带malloc函数时&#xff0c;此时&#xff0c;就需要手动编写&#xff0c;在此做个笔录。&#xff08;已在项目上使用&#xff09;&#xff0c;还可进入对齐管理机制。 直接…

常用SQL查询方法与实例

目录 SELECT查询 INSERT查询 UPDATE查询 DELETE查询 JOIN查询 GROUP BY查询 HAVING查询 窗口函数 公共表表达式&#xff08;CTEs&#xff09; 递归查询 透视表 分析函数 解透视 条件聚合 日期函数 合并语句 情况语句 常用SQL查询方法有以下几种&#xff1a; S…

C 嵌入式系统设计模式 14:轮询模式

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述访问硬件的设计模式之七&…

图像生成地表最强!Playground v2.5技术报告解读重磅来袭!超越SD、DALL·E 3和 Midjourney

文章链接&#xff1a;https://arxiv.org/pdf/2402.17245 模型地址&#xff1a; https://huggingface.co/playgroundai/playground-v2.5-1024px-aesthetic 本文分享了在文本到图像生成模型中实现SOTA美学质量的三个见解。专注于模型改进的三个关键方面&#xff1a;增强色彩和对…

代码异常处理

一、异常格式 错误堆栈信息的格式大致如下&#xff1a; 第一行包含了错误类型&#xff08;Exception或Error&#xff09;和错误描述。 从第二行开始&#xff0c;每一行都表示一个调用栈帧&#xff08;Stack Frame&#xff09;&#xff0c;包含了类名、方法名和代码行号。二、…

单片机独立按键控制LED状态

一、前言 这幅图是按键的抖动与时间的联系 按键抖动&#xff1a;对于机械开关&#xff0c;当机械鮑点断开、闭合时&#xff0c;由于机械触点的弹性作用&#xff0c;一个开关在闭合时不会马上稳定地接通&#xff0c;在断开时也不会一下子断开&#xff0c;所以在开关闭合及断开的…

动态规划|【路径问题】礼物的最大价值(LCR 166.珠宝的最高价值)

目录 题目 题目解析 思路 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 代码 题目 LCR 166. 珠宝的最高价值 &#xff08;现在leetcode上面是这个题&#xff09;这个题跟下面这个题叙述方式一样&#xff0c;就拿下面这个 题来讲解&#xff09; 题目描述&…

Java配置48-nginx 按照日期生成日志

1. 背景 默认情况下&#xff0c;nginx 的日志会一直输入到 access.log&#xff0c;长时间运行后会导致这个日志文件过大。 2. 方法 修改 nginx.conf map $time_iso8601 $logdate {~^(?<ymd>\d{4}-\d{2}-\d{2}) $ymd;default date-not-found;}access_log logs/acce…

深度神经网络联结主义的本质

一、介绍 在新兴的人工智能 (AI) 领域&#xff0c;深度神经网络 (DNN) 是一项里程碑式的成就&#xff0c;突破了机器学习、模式识别和认知模拟的界限。这一技术奇迹的核心是一个与认知科学本身一样古老的思想&#xff1a;联结主义。本文深入探讨了联结主义的基本原理&#xff0…

四、《任务列表案例》后端程序实现和测试

本章概要 准备工作功能实现前后联调 4.1 准备工作 数据库脚本 CREATE TABLE schedule (id INT NOT NULL AUTO_INCREMENT,title VARCHAR(255) NOT NULL,completed BOOLEAN NOT NULL,PRIMARY KEY (id) );INSERT INTO schedule (title, completed) VALUES(学习java, true),(学…

打造透明银行存储:Solidity智能合约的实践与探索

引言&#xff1a; 随着区块链技术的快速发展&#xff0c;智能合约作为其中的核心组件&#xff0c;正被越来越多地应用于各种场景。作为智能合约的编程语言&#xff0c;Solidity因其对以太坊平台的深度支持而备受关注。在这篇文章中&#xff0c;我们将通过构建一个透明的银行存储…

【踩坑专栏】追根溯源,从Linux磁盘爆满排查故障:mycat2与navicat不兼容导致日志暴增

昨天遇到了一个比较奇怪的问题&#xff0c;就是在挂起虚拟机的时候&#xff0c;虚拟机提示我XX脚本正在运行&#xff0c;很奇怪&#xff0c;我没有运行脚本&#xff0c;为什么会提示我这个呢。今天恢复虚拟机&#xff0c;也提示了一下脚本的问题&#xff0c;而且发现Linux明显异…

HCIA-HarmonyOS设备开发认证V2.0-习题

目录 习题一习题二&#xff08;待续...&#xff09;坚持就有收获 习题一 # HarmonyOS简介 1. 以下哪几项属于OpenHarmony的技术特性&#xff1f;&#xff08;&#xff09;A. 统一OS&#xff0c;弹性部署B. 一次开发&#xff0c;多端部署C. 硬件互助&#xff0c;资源共享2. Ope…

靶机渗透之sar

Name: Sar: 1Date release: 15 Feb 2020Author: LoveSeries: Sar Download: https://drive.google.com/open?id1AFAmM21AwiAEiVFUA0cSr_GeAYaxd3lQ 对于vulnhub中的靶机&#xff0c;我们都需先下载镜像&#xff0c;然后导入VM&#xff0c;并将网络连接改为NAT模式。首先我们…

使用Python,maplotlib绘制树型有向层级结构图

使用Python&#xff0c;maplotlib绘制树型有向层级结构图 1. 效果图2. 源码2.1 plotTree.py绘制层级结构及不同样式2.2 plotArrow.py 支持的所有箭头样式 参考 前俩篇博客介绍了 1. 使用Python&#xff0c;networkx对卡勒德胡赛尼三部曲之《群山回唱》人物关系图谱绘制 2. 使用…

C# 学习第四弹——字符串

一、char类型的使用 字符使用单引号&#xff0c;单个字符 转义字符是一种特殊的字符变量&#xff0c;以反斜线开头&#xff0c;后跟一个或多个字符。 输出多级目录可以使用 二、字符串的声明和初始化 1、引用字符串常量 引用字符串常量初始化——字符使用单引号&#xff0…

阿里云轻量服务器,ubuntu20.04安装Redis

第一步&#xff1a;下载xshell7,连接阿里云服务器 就是下图这个ip 第二步&#xff1a;输入用户名和密码 上面那一步完成之后&#xff0c;就会弹出来下面这个图片 用户名是root 密码是你的阿里云服务器密码 如果你要是忘了&#xff0c;如下图&#xff0c;重置密码&#xff0…