使用Qt编程QtNetwork无法使用

2024-09-09 03:44

本文主要是介绍使用Qt编程QtNetwork无法使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用 VS 构建 Qt 项目时 QtNetwork 无法使用的问题 - 摘叶飞镖 - 博客园 (cnblogs.com)

另外,强烈建议在使用QNetworkAccessManager之前看看这篇文章:

Qt 之 QNetworkAccessManager踏坑记录-CSDN博客

C++ Qt开发:QNetworkAccessManager网络接口组件

阅读目录

  • 1.1 通用API函数
  • 1.2 实现Web页面访问

Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QNetworkAccessManager组件实现Web网页访问。

QNetworkAccessManager是Qt网络模块中的关键类,用于管理网络访问和请求。作为一个网络请求的调度中心,它为Qt应用程序提供了发送和接收各种类型的网络请求的能力,包括常见的GET、POST、PUT、DELETE等。这个模块的核心功能在于通过处理QNetworkReplyQNetworkRequest来实现与网络资源的交互。

通过QNetworkAccessManager,Qt应用程序能够轻松地与远程服务器通信,获取数据或将数据上传到服务器。这种网络请求的管理不仅是异步的,以确保不会阻塞主线程,还提供了丰富的信号和槽机制,使得开发者可以灵活地处理不同阶段的网络操作。

通常,QNetworkAccessManager会与QNetworkReplyQNetworkRequest一起使用。QNetworkRequest用于封装和配置网络请求的各种属性,例如URL、请求头等。而QNetworkReply则代表了对网络请求的响应,包含了请求返回的数据和相关信息。这三者共同协作,为Qt应用程序提供了便捷、灵活且强大的网络通信能力。

回到顶部

1.1 通用API函数

1.1.1 QNetworkAccessManager

要想实现网络通信首先需要新建一个网络访问管理器,以下是QNetworkAccessManager类中的一些常用函数及其描述:

函数描述
QNetworkAccessManager(QObject *parent = nullptr)构造函数,创建一个QNetworkAccessManager实例。
virtual ~QNetworkAccessManager()虚析构函数,释放QNetworkAccessManager实例。
QNetworkReply *get(const QNetworkRequest &request)发送GET请求,并返回与请求关联的QNetworkReply对象。
QNetworkReply *post(const QNetworkRequest &request, QIODevice *data)发送POST请求,并返回与请求关联的QNetworkReply对象。
QNetworkReply *post(const QNetworkRequest &request, const QByteArray &data)发送POST请求,并返回与请求关联的QNetworkReply对象。
QNetworkReply *put(const QNetworkRequest &request, QIODevice *data)发送PUT请求,并返回与请求关联的QNetworkReply对象。
QNetworkReply *put(const QNetworkRequest &request, const QByteArray &data)发送PUT请求,并返回与请求关联的QNetworkReply对象。
QNetworkReply *deleteResource(const QNetworkRequest &request)发送DELETE请求,并返回与请求关联的QNetworkReply对象。
QNetworkReply *head(const QNetworkRequest &request)发送HEAD请求,并返回与请求关联的QNetworkReply对象。
QNetworkReply *sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QIODevice *data = nullptr)发送自定义请求,并返回与请求关联的QNetworkReply对象。
QNetworkReply *sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, const QByteArray &data)发送自定义请求,并返回与请求关联的QNetworkReply对象。
void setConfiguration(const QNetworkConfiguration &config)设置网络配置,用于定制网络行为。
QNetworkConfiguration configuration() const获取当前网络配置。
void clearAccessCache()清除网络访问缓存。
void setCache(QAbstractNetworkCache *cache)设置网络缓存。
QAbstractNetworkCache *cache() const获取当前网络缓存。
void setCookieJar(QNetworkCookieJar *cookieJar)设置用于管理HTTP cookie的QNetworkCookieJar
QNetworkCookieJar *cookieJar() const获取当前的HTTP cookie管理器。

这些函数提供了QNetworkAccessManager的核心功能,使得开发者能够方便地进行各种类型的网络请求,配置网络参数,并进行相关的网络管理操作。

1.1.2 QNetworkReply

以下是QNetworkReply类中的一些常用函数及其描述:

函数描述
QByteArray readAll() const读取所有可用的数据,并返回一个QByteArray,包含从网络回复读取的所有内容。
QByteArray peek(int maxSize) const查看最多maxSize字节的可用数据,但不从缓冲区中移除。
QByteArray read(int maxSize)从网络回复中读取最多maxSize字节的数据,并将其从缓冲区中移除。
QByteArray readLine(int maxSize = 0)从网络回复中读取一行数据,最多包含maxSize字节,并将其从缓冲区中移除。
void ignoreSslErrors(const QList<QSslError> &errors = QList<QSslError>())忽略SSL错误,继续处理网络回复。
void abort()终止网络回复的处理,关闭底层连接。
void close()关闭网络回复的处理。
QUrl url() const返回与网络回复相关联的URL。
QNetworkRequest request() const返回生成此网络回复的网络请求。
QNetworkAccessManager *manager() const返回与网络回复相关联的QNetworkAccessManager
bool isFinished() const检查网络回复是否已完成。
QNetworkReply::NetworkError error() const返回网络回复的错误代码。
bool hasRawHeader(const QByteArray &headerName) const检查网络回复是否包含指定原始头。
QList<QByteArray> rawHeaderList() const返回网络回复的所有原始头的列表。
QByteArray rawHeader(const QByteArray &headerName) const返回指定原始头的值。
QVariant header(QNetworkRequest::KnownHeaders header) const返回指定标准头的值。
QList<QByteArray> rawHeaderValues(const QByteArray &headerName) const返回指定原始头的所有值。
QVariant attribute(QNetworkRequest::Attribute code) const返回指定网络请求属性的值。
QIODevice *readAllStandardOutput()读取标准输出的所有数据,并返回一个QIODevice,用于访问读取的内容。
QIODevice *readAllStandardError()读取标准错误的所有数据,并返回一个QIODevice,用于访问读取的内容。
bool isReadable() const检查网络回复是否可读取。

这些函数提供了对QNetworkReply实例进行各种操作和查询的方法,包括读取回复数据、处理SSL错误、获取请求信息、检查错误状态等。开发者可以根据具体需求使用这些函数来有效地与网络回复进行交互。

1.1.3 QNetworkRequest

以下是QNetworkRequest类中的一些常用函数及其描述:

函数描述
QNetworkRequest(const QUrl &url)使用给定的URL构造一个QNetworkRequest实例。
void setUrl(const QUrl &url)设置QNetworkRequest的URL。
QUrl url() const返回与QNetworkRequest相关联的URL。
void setRawHeader(const QByteArray &headerName, const QByteArray &headerValue)设置指定原始头的值。
QByteArray rawHeader(const QByteArray &headerName) const返回指定原始头的值。
bool hasRawHeader(const QByteArray &headerName) const检查QNetworkRequest是否包含指定原始头。
void setRawHeaderList(const QList<QByteArray> &headerList)设置所有原始头的列表。
QList<QByteArray> rawHeaderList() const返回QNetworkRequest的所有原始头的列表。
void setHeader(QNetworkRequest::KnownHeaders header, const QVariant &value)设置指定标准头的值。
QVariant header(QNetworkRequest::KnownHeaders header) const返回指定标准头的值。
void setAttribute(QNetworkRequest::Attribute code, const QVariant &value)设置指定网络请求属性的值。
QVariant attribute(QNetworkRequest::Attribute code) const返回指定网络请求属性的值。
void setSslConfiguration(const QSslConfiguration &config)设置SSL配置。
QSslConfiguration sslConfiguration() const返回SSL配置。
void setMaximumRedirectsAllowed(int maxRedirects)设置允许的最大重定向次数。
int maximumRedirectsAllowed() const返回允许的最大重定向次数。
void setOriginatingObject(QObject *object)设置发起此网络请求的对象。
QObject *originatingObject() const返回发起此网络请求的对象。
bool isEmpty() const检查QNetworkRequest是否为空(未设置URL)。

这些函数提供了对QNetworkRequest实例进行各种操作和查询的方法,包括设置和获取头信息、设置SSL配置、设置和获取网络请求属性等。开发者可以根据具体需求使用这些函数来有效地构建和管理网络请求。

回到顶部

1.2 实现Web页面访问

要使用该模块读者应该在*.pro文件内包含network网络模块,并在头文件中引入QNetworkAccessManagerQNetworkReplyQNetworkRequest三个类,在建立访问时首先使用QNetworkAccessManager新增一个manager管理类,并通过QNetworkRequest类创建一个GET请求地址,通过使用manager.get方法实现对特定页面的访问。

当访问完成时需要通过一个信号来实现对数据的处理,在QNetworkReply类中包含有如下表所示的信号以供读者使用,例如当访问被完成时则自动触发&QNetworkReply::finished完成信号,此时只需要对该信号进行相应的处理即可,通常会使用一个槽函数来处理它。

信号描述
finished()当网络请求完成时发出。
downloadProgress(qint64, qint64)在下载过程中定期发出,提供下载进度信息。参数为已下载的字节数和总字节数。
uploadProgress(qint64, qint64)在上传过程中定期发出,提供上传进度信息。参数为已上传的字节数和总字节数。
readyRead()当有可读取的数据时发出,用于通知应用程序可以调用readAll()read()方法以获取更多数据。
error(QNetworkReply::NetworkError)当网络请求发生错误时发出,参数为错误代码。
sslErrors(const QList<QSslError> &)当SSL错误发生时发出,参数为SSL错误的列表。

这些信号提供了丰富的信息,使开发者能够在不同阶段处理网络请求。同理,在下载和上传过程中可以使用downloadProgressuploadProgress信号来获取进度信息,readyRead信号表示有可读取的数据,error信号表示请求发生错误,sslErrors信号表示SSL相关的错误。

当信号被触发时则会通过QObject::connect连接到对应的槽函数上,如下案例中所示,在槽函数内通过reply->attribute方法我们获取到此次响应码中的QNetworkRequest::HttpStatusCodeAttribute属性,该属性用来指明本次访问的状态值。此类属性也有许多可供参考,如下所示;

属性描述
QNetworkRequest::HttpStatusCodeAttributeHTTP响应的状态码。
QNetworkRequest::HttpReasonPhraseAttributeHTTP响应的原因短语,如"OK"、"Not Found"等。
QNetworkRequest::RedirectionTargetAttribute重定向目标的URL。
QNetworkRequest::ConnectionEncryptedAttribute连接是否加密的标志,返回一个bool值。
QNetworkRequest::SourceIsFromCacheAttribute请求是否来自缓存的标志,返回一个bool值。
QNetworkRequest::HttpPipeliningAllowedAttribute是否允许HTTP流水线传输的标志,返回一个bool值。
QNetworkRequest::HttpPipeliningWasUsedAttribute是否使用了HTTP流水线传输的标志,返回一个bool值。
QNetworkRequest::CustomVerbAttribute自定义请求动作(HTTP verb)的字符串。
QNetworkRequest::User用户自定义的属性,用于存储任意类型的用户数据。

这些属性提供了额外的信息,使得开发者能够更全面地了解和处理网络响应。根据具体的应用需求,开发者可以选择使用这些属性中的一个或多个来获取所需的信息。

#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建网络访问管理器QNetworkAccessManager manager;// 创建GET请求QNetworkRequest request(QUrl("http://www.baidu.com"));// 发送GET请求QNetworkReply *reply = manager.get(request);// 连接信号槽,处理响应QObject::connect(reply, &QNetworkReply::finished, [&](){if (reply->error() == QNetworkReply::NoError){// 获取请求的 URLqDebug() << "Request URL:" << reply->request().url();// 输出请求头信息qDebug() << "Request Headers:";QList<QByteArray> requestHeaders = reply->request().rawHeaderList();foreach (const QByteArray &header, requestHeaders) {qDebug() << header << ":" << reply->request().rawHeader(header);}// 获取响应码int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();qDebug() << "HttpStatusCodeAttribute:" << statusCode;// 连接是否加密的标志bool connectionEncryptedAttribute = reply->attribute(QNetworkRequest::ConnectionEncryptedAttribute).toBool();qDebug() << "ConnectionEncryptedAttribute:" << connectionEncryptedAttribute;// 请求是否来自缓存的标志bool sourceIsFromCacheAttribute = reply->attribute(QNetworkRequest::SourceIsFromCacheAttribute).toBool();qDebug() << "SourceIsFromCacheAttribute:" << sourceIsFromCacheAttribute;// HTTP请求是否被允许进行流水线处理的标志bool httpPipeliningAllowedAttribute = reply->attribute(QNetworkRequest::HttpPipeliningAllowedAttribute).toBool();qDebug() << "HttpPipeliningAllowedAttribute:" << httpPipeliningAllowedAttribute;// 输出响应头信息qDebug() << "Response Headers:";QList<QByteArray> responseHeaders = reply->rawHeaderList();foreach (const QByteArray &header, responseHeaders) {qDebug() << header << ":" << reply->rawHeader(header);}// 处理响应内容,这里可以使用 readAll() 方法获取响应内容// qDebug() << "Response Content:" << reply->readAll();} else{qDebug() << "Error:" << reply->errorString();}// 释放资源reply->deleteLater();QCoreApplication::quit();});return a.exec();
}

读者可自行编译并运行这段代码,观察请求与相应数据如下图所示;

至于如何在图形界面中使用则就更简单了,首先我们在mainwindow.h头文件中定义好所需要的两个槽函数,函数on_finished()用于在完成请求后被调用,函数on_readyRead()则用于在回调被执行后调用,并并以两个网络管理类的指针变量,如下所示;

class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots://自定义槽函数void on_finished();void on_readyRead();void on_pushButton_clicked();private:Ui::MainWindow *ui;QNetworkAccessManager networkManager;   // 网络管理QNetworkReply *reply;                   // 网络响应
};

当获取按钮被点击后则开始执行读入指定URL地址,并对该地址进行网页访问,同时绑定这两个信号,一旦被触发则自动路由到对应的槽函数上面去,如下所示;

void MainWindow::on_pushButton_clicked()
{// 读入URL地址QString urlSpec = ui->lineEdit->text().trimmed();if (urlSpec.isEmpty()){QMessageBox::information(this, "错误", "请指定URL");return;}// 格式化URLQUrl newUrl = QUrl::fromUserInput(urlSpec);if (!newUrl.isValid()){QMessageBox::information(this, "错误", QString("无效URL: %1").arg(urlSpec));return;}// 访问页面reply = networkManager.get(QNetworkRequest(newUrl));// 完成时的槽函数绑定connect(reply, SIGNAL(finished()), this, SLOT(on_finished()));// 读入数据的槽函数绑定connect(reply, SIGNAL(readyRead()), this, SLOT(on_readyRead()));}

相对应的,在on_finished()槽函数中我们将响应头读出并输出到文本框中,在on_readyRead()槽函数中则是对整个网站页面源代码的输出功能,完整代码如下所示;

void MainWindow::on_finished()
{// 获取响应码int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();if(statusCode == 200){ui->plainTextEdit_2->appendPlainText("响应头数据:");// 输出响应头信息QList<QByteArray> responseHeaders = reply->rawHeaderList();foreach (const QByteArray &header, responseHeaders){ui->plainTextEdit_2->appendPlainText(header + " : " + reply->rawHeader(header));}}
}// 读入页面源代码
void MainWindow::on_readyRead()
{ui->plainTextEdit->setPlainText(reply->readAll());
}

运行代码,读者可自行输入特定的网站进行读取测试,如下所示(完整代码请参考课件部分);

文章出处:https://www.cnblogs.com/LyShark/p/18068071
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

合集: Qt Creator 编程技术实践

[Ctrl+Enter快捷键提交]

公告

LyShark



访问官网 | 联系邮箱

作者是一名纯粹的开源技术爱好者,六年来无私分享自己的经验和知识,愿我们共同进步,感谢大家的支持。

 

Microsoft MVP



微软最有价值专家

致力于研究Microsoft技术在信息安全领域的最佳实践,并在业内拥有超过10余年的行业研究经验。

昵称: lyshark
园龄: 6年4个月
粉丝: 1331
关注: 0

+加关注

搜索

最新随笔

  • 1.使用微软Detours库进行DLL注入
  • 2.使用微软Detours库进行模块枚举
  • 3.揭开虚拟与现实的帷幕:二进制世界与道
  • 4.运用Npcap库实现SYN半开放扫描
  • 5.C++ Qt开发:QProcess进程管理模块
  • 6.C++ Qt开发:QUdpSocket实现组播通信
  • 7.C++ Qt开发:QUdpSocket网络通信组件
  • 8.C++ Qt开发:QTcpSocket网络通信组件
  • 9.C++ Qt开发:QNetworkAccessManager网络接口组件
  • 10.C++ Qt开发:QNetworkInterface网络接口组件

积分与排名

  • 积分 - 1337782
  • 排名 - 197

合集

  • Windows 内核安全编程技术实践(96)
  • 灰帽黑客:攻守道:卷1(99)
  • 灰帽黑客:攻守道:卷2(99)
  • 灰帽黑客:攻守道:卷3(77)
  • Qt 窗体开发从入门到精通(34)
  • Qt Creator 编程技术实践(47)
  • x64dbg 自动化从入门到精通(37)
  • Linux 系统运维技术实践(48)
  • Windows 汇编语言入门(27)

随笔分类

  • 《C/C++ 反汇编系列实战》(8)
  • 《Flask Web 框架技术实践》(20)
  • 《Linux 系统运维技术实践》(67)
  • 《MySQL 数据库从入门到精通》(22)
  • 《Python 编程技术实践》(34)
  • 《Python 代码片段总结》(27)
  • 《Python 入门系列教程》(25)
  • 《Qt Creator 编程技术实践》(48)
  • 《Qt 窗体开发从入门到精通》(34)
  • 《Visual C# 开发技术实战应用》(12)
  • 《Visual C++ 编程技术实践》(85)
  • 《Visual C++ 代码片段笔记》(29)
  • 《Visual C++ 入门系列教程》(47)
  • 《Windows PE结构系列教程》(15)
  • 《Windows 汇编语言入门教程》(26)
  • 《Windows 内核安全编程技术实践》(93)
  • 《x64dbg 自动化从入门到精通》(34)
  • 《灰帽黑客:攻守道》(273)
  • 《渗透测试与网络安全实战》(49)
  • 《网络设备实战配置笔记》(9)

随笔档案

  • 2024年8月(4)
  • 2024年3月(10)
  • 2024年1月(3)
  • 2023年12月(57)
  • 2023年11月(110)
  • 2023年10月(65)
  • 2023年9月(49)
  • 2023年8月(60)
  • 2023年7月(22)
  • 2023年6月(23)
  • 2023年5月(6)
  • 2023年4月(3)
  • 2023年3月(2)
  • 2023年2月(3)
  • 2022年11月(3)
  • 2022年10月(39)
  • 2022年9月(18)
  • 2022年8月(12)
  • 2022年7月(20)
  • 2022年4月(2)
  • 2022年3月(1)
  • 2022年2月(2)
  • 2022年1月(10)
  • 2021年12月(23)
  • 2021年11月(17)
  • 2021年10月(2)
  • 2021年9月(2)
  • 2021年8月(3)
  • 2021年7月(5)
  • 2021年6月(3)
  • 2021年5月(3)
  • 2021年4月(2)
  • 2021年3月(4)
  • 2021年2月(5)
  • 2021年1月(3)
  • 2020年12月(2)
  • 2020年11月(2)
  • 2020年10月(6)
  • 2020年9月(22)
  • 2020年8月(17)
  • 2020年7月(4)
  • 2020年6月(18)
  • 2020年5月(21)
  • 2020年4月(7)
  • 2020年3月(10)
  • 2020年2月(7)
  • 2020年1月(14)
  • 2019年12月(10)
  • 2019年11月(22)
  • 2019年10月(8)
  • 2019年9月(6)
  • 2019年8月(39)
  • 2019年7月(25)
  • 2019年6月(3)
  • 2019年5月(5)
  • 2019年4月(4)
  • 2019年3月(3)
  • 2019年1月(22)
  • 2018年12月(15)
  • 2018年11月(8)
  • 更多


 8351901 |  6411443
博客园 - 开发者的网上家园

这篇关于使用Qt编程QtNetwork无法使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150068

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

三国地理揭秘:为何北伐之路如此艰难,为何诸葛亮无法攻克陇右小城?

俗话说:天时不如地利,不是随便说说,诸葛亮六出祁山,连关中陇右的几座小城都攻不下来,行军山高路险,无法携带和建造攻城器械,是最难的,所以在汉中,无论从哪一方进攻,防守方都是一夫当关,万夫莫开;再加上千里运粮,根本不需要打,司马懿只需要坚守城池拼消耗就能不战而屈人之兵。 另一边,洛阳的虎牢关,一旦突破,洛阳就无险可守,这样的进军路线,才是顺势而为的用兵之道。 读历史的时候我们常常看到某一方势

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma