C++ Qt 学习(六):Qt http 编程

1. http 基础

  • HTTP 基础教程
  • C++ Web 框架
    • drogon
    • oatpp

2. C++ Qt 用户登录、注册功能实现

在这里插入图片描述

  • login_register.h
#pragma once#include <QtWidgets/QDialog>
#include "ui_login_register.h"
#include <QNetworkReply>class login_register : public QDialog {Q_OBJECTpublic:login_register(QWidget *parent = Q_NULLPTR);private:void test_http_post();void test_timeout_http_post();private slots:void on_btnLogin_clicked();void post_requestFinished(QNetworkReply* reply);private:Ui::login_registerClass ui;
};
  • login_register.cpp
#pragma execution_character_set("utf-8")#include "login_register.h"#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
#include <QJsonValue>
#include <QMessageBox>
#include <QTimer>login_register::login_register(QWidget *parent) : QDialog(parent) {ui.setupUi(this);
}void login_register::on_btnLogin_clicked() {//test_http_post();test_timeout_http_post();
}void login_register::test_http_post() {QNetworkAccessManager* pHttpMgr = new QNetworkAccessManager();// 设置 urlQString url = "http://127.0.0.1:8080/login";// 设置头信息QNetworkRequest requestInfo;requestInfo.setUrl(QUrl(url));requestInfo.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));// setRawDataQJsonObject rawJson;rawJson.insert("username", "zhangsan");rawJson.insert("password", "123456");QByteArray byte_array = QJsonDocument(rawJson).toJson();// 发送 post 请求QNetworkReply* reply = pHttpMgr->post(requestInfo, byte_array);if (reply) {// 添加事件循环机制,返回后再运行后面的connect(pHttpMgr, &QNetworkAccessManager::finished, this, &login_register::post_requestFinished);}
}void login_register::post_requestFinished(QNetworkReply* reply) {// 获取 http 状态码QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);if (statusCode.isValid())qDebug() << "status code=" << statusCode.toInt();QVariant reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();if (reason.isValid())qDebug() << "reason=" << reason.toString();QNetworkReply::NetworkError err = reply->error();if (err != QNetworkReply::NoError) {// 请求失败QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);QMessageBox::information(this, "warn","http post failed, error code = " + statusCode.toString() + " error info: " + reply->errorString());return;} else {// 请求成功// 接收请求结果QByteArray responseByte = reply->readAll();QString strRes = responseByte;QMessageBox::information(this, "http post success","post response = " + strRes);}
}void login_register::test_timeout_http_post() {QNetworkAccessManager* pHttpMgr = new QNetworkAccessManager();// 设置 urlQString url = "http://127.0.0.1:8080/login";// 设置头信息QNetworkRequest requestInfo;requestInfo.setUrl(QUrl(url));requestInfo.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));// setRawDataQJsonObject rawJson;rawJson.insert("username", "zhangsan");rawJson.insert("password", "123456");QByteArray byte_array = QJsonDocument(rawJson).toJson();// 发送 post 请求QNetworkReply* reply = pHttpMgr->post(requestInfo, byte_array);// 添加超时处理,1ms 超时QEventLoop eventloop;connect(reply, SIGNAL(finished()), &eventloop, SLOT(quit()));// 比如设置 1ms 内完成请求,否则就认为是超时QTimer::singleShot(1000, &eventloop, &QEventLoop::quit);eventloop.exec();QByteArray array;if (reply->isFinished()) {if (reply->error() == QNetworkReply::NoError) {// 正常结束,读取响应数据QByteArray result = reply->readAll();QString strRes = result;QMessageBox::information(this, "http post success","post response = " + strRes);} else {// 异常结束// 请求失败QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);QMessageBox::information(this, "warn","http post failed, error code = " + statusCode.toString() + " error info: " + reply->errorString());return;}} else {// 请求超时disconnect(reply, &QNetworkReply::finished, &eventloop, &QEventLoop::quit);reply->abort();QMessageBox::information(this, "http post timeout", "http post timeout");}reply->deleteLater();
}

3. Qt json 解析介绍

  • ch65_qtjson.cpp
#include "ch65_qtjson.h"
#include <string>
#include <QJsonDocument> 
#include <QJsonObject>
#include <QDebug>using namespace std;ch65_qtjson::ch65_qtjson(QWidget *parent) : QWidget(parent) {ui.setupUi(this);/*string json_str = R"({"date": "20220701","level": 1,"msg": "register account","status": "success","username": "jackli"})";*/string json_str = R"({})";QString qstr = QString::fromStdString(json_str);if (qstr.isEmpty()) {qDebug() << "qstr is empty";return;}QByteArray jbyte = qstr.toLocal8Bit();// 捕获转换过程中出现的错误QJsonParseError error;QJsonDocument jdoc = QJsonDocument::fromJson(jbyte, &error);if (error.error != QJsonParseError::NoError) {// 有错误qDebug() << "json parse error";return;}qDebug() << "json parse success";if (jdoc.isNull() || jdoc.isEmpty()) {qDebug() << "json docment is empty";return;}QJsonObject jobj = jdoc.object();QString date = jobj["date"].toString();qDebug() << "date" << date;int level = jobj["level"].toInt();qDebug() << "level" << level;
}ch65_qtjson::~ch65_qtjson() {}

4. C++ nlohmann::json 使用介绍

  • nlohmann::json

  • Qt 有 json 解析相关的类,但不推荐使用,建议使用 nlohmann::json,这个 json 适用于任何 C++ 框架

  • nlohmann::json 只需要一个头文件 json.hpp,不需要编译成 lib,直接放到项目中即可使用

  • main.cpp

#include <iostream>
#include "json.hpp"
#include <string>using json_t = nlohmann::json;using namespace std;int parse_array() {string jsonstr = R"({"id":"2022","name":{"EnglishName":"JackMa"},"title":[{"company":"taobao", "position" : "AAA", "salary" : "10000"},{ "company":"zhifubao","position" : "CCC","salary" : "890898" },{ "company":"pingtouge","position" : "KKK","salary" : "76843" }]})";try {json_t jsonObj = json_t::parse(jsonstr);// 取出 namejson_t nameJson = jsonObj["name"];string engName = nameJson["EnglishName"];cout << "engName = " << engName << endl;// 取出 titlejson_t titleJson = jsonObj["title"];int size = titleJson.size();cout << "size = " << size << endl;for (auto jsonItem : titleJson) {cout << jsonItem["company"] << endl;cout << jsonItem["position"] << endl;cout << jsonItem["salary"] << endl;}} catch (const std::exception&) {return -1;}return 0;
}int main() {/* 序列化,把 json 数据转成 string */json_t jRawdata;jRawdata["username"] = "jackli";jRawdata["pwd"] = "123456";// nlohmann::json 中的 dump 方法实现数据转储string _rawdata = jRawdata.dump(4);cout << _rawdata << endl; /* 反序列化,把 string 数据转成 json */string json_str = R"({"date": "20220701","level": 1,"msg": "register account","status": "success","username": "jackli"})";try  {json_t j2 = json_t::parse(json_str);string date = j2["date"];cout << date << endl;} catch (std::exception& e) {cout << "json parse failed" << endl;return -1;}/* 解析复杂 json 数据 */cout << "解析 json 数组" << endl;if (parse_array() != 0) {cout << "parse array failed" << endl;}return 0;
}

5. libcurl 解析

  • libcurl 是一个跨平台的网络协议库,支持 http、https,ftp,telnet 等应用层协议
  • libcurl 主要功能就是用不同的协议连接和沟通不同的服务器

5.1 libcurl 编译

  • 流程同 CEF 编译
    • 参考链接

5.2 使用 libcurl 进行 http post 请求

#include <iostream>
#include "curl/curl.h"
#include <iostream>
#include <sstream>
#include <string>
#include "json.hpp"using namespace std;using json_t = nlohmann::json;// 数据处理回调函数
size_t write_data(void* ptr, size_t size, size_t nmemb, void* stream) {string data((const char*)ptr, (size_t)size * nmemb);*((stringstream*)stream) << data << endl;return size * nmemb;
}int main() {/* 以下代码为通过 Postman 生成 */// Postman 是一款用于发送 HTTP 请求的测试工具CURL* curl;CURLcode res;stringstream jsonRespon;curl = curl_easy_init();if (curl) {curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");curl_easy_setopt(curl, CURLOPT_URL, "127.0.0.1:8080/login");curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);//curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");struct curl_slist* headers = NULL;headers = curl_slist_append(headers, "Content-Type: application/json");curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);string data = R"({"username":"jackhui","password":"1234"})";curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);curl_easy_setopt(curl, CURLOPT_WRITEDATA, &jsonRespon);res = curl_easy_perform(curl);if (res != 0) {cout << "request failed" << endl;return -1;}}curl_easy_cleanup(curl);cout << "request success 222" << endl;/* 以上代码为通过 Postman 生成 */string json = jsonRespon.str();try {json_t j = json_t::parse(json);cout << j.dump(4) << endl;string data = j["date"];} catch (std::exception& e) {cout << "json parse failed" << endl;return -2;}return 0;
}

在这里插入图片描述

6. websocket

6.1 基本概念

  • websocket 是 HTML5 中新增的一个协议,这个协议的出现,让客户端和服务器之前的数据交互变成全双工的

  • websocket 的出现,最主要的变化是允许服务器主动给客户端推送数据。这一大改变,就让 websocket 具有了以往其它协议无法比拟的实时通信能力。要实现 websocket 服务,需要客户端和服务端都得支持 websocket 协议才可以

  • websocket 详解

  • Websocket 能做什么?

    • 聊天、消息推送、多人在线业务
    • 推荐一个开源项目 OpenIM
  • websocket 与 http 的区别

    • 相同点
      • 都是一样基于 TCP 的,都是可靠性传输协议
      • 都是应用层协议
    • 不同点
      • websocket 是持久连接,http 是短连接
      • websocket 的协议是以 ws/wss 开头,http 对应的是 http/https
      • websocket 是有状态的,http 是无状态的
      • websocket 连接之后服务器和客户端可以双向发送数据,http 只能是客户端发起一次请求之后,服务器才能返回数据
      • websocket 连接建立之后,不需要再发送 request 请求,数据直接从 TCP 通道传输
  • websocketpp 是用 c++ 实现的一个 websocket 库,用来支持 websocket 协议

    • websocketpp

6.2 C++ Qt 实现 websocket server

Qt websocket 的实现(需包含 websockets 第三方模块)

  • QWebSocketServer(服务端)
  • QWebSocket(客户端)

在这里插入图片描述

  • WebsocketServer.h
#pragma once#include <QtWidgets/QWidget>
#include "ui_WebsocketServer.h"
#include <QWebSocketServer>
#include <QWebSocket>
#include <QMap>class WebsocketServerDemo : public QWidget {Q_OBJECTpublic:WebsocketServerDemo(QWidget *parent = Q_NULLPTR);~WebsocketServerDemo();private slots:void on_btnOpenServer_clicked();void on_btnCloseServer_clicked();void on_btnSend_clicked();void onNewConnection();void processTextMessage(QString message);void socketDisconnected();private:Ui::WebsocketServerClass ui;QWebSocketServer* m_WebSocketServer = nullptr;QList<QWebSocket*> m_clients;bool m_debug;QWebSocket* pSocket;QDateTime* current_date_time;QMap<QString, QWebSocket*> mapSocket;
};
  • WebsocketServer.cpp
#include "WebsocketServer.h"
#include <QMessageBox>
#include <string>
#include <Windows.h>
#include <iostream>using namespace std;WebsocketServerDemo::WebsocketServerDemo(QWidget *parent) : QWidget(parent) {ui.setupUi(this);this->setWindowTitle(u8"Websocket Server");this->resize(1000, 600);ui.lineEdit_IP->setText("192.168.74.1");ui.lineEdit_Port->setText("8000");// 创建服务m_WebSocketServer = new QWebSocketServer(u8"server", QWebSocketServer::NonSecureMode);
}WebsocketServerDemo::~WebsocketServerDemo() {if (m_WebSocketServer) {if(m_WebSocketServer->isListening())m_WebSocketServer->close();}  
}// 开启服务
void WebsocketServerDemo::on_btnOpenServer_clicked() {QString ip = ui.lineEdit_IP->text();QString port = ui.lineEdit_Port->text();// 监听 ip 和端口if (m_WebSocketServer->listen(QHostAddress(ip), port.toInt())) {ui.textEdit_RecvMsg->append(u8"服务开启成功");ui.btnOpenServer->setEnabled(false);// 服务成功开启则触发 onNewConnection() 槽函数connect(m_WebSocketServer, SIGNAL(newConnection()), this, SLOT(onNewConnection()));} else {QMessageBox::information(this, u8"提示", u8"监听失败, 是否开启了代理,或者IP错误");}
}// 关闭服务
void WebsocketServerDemo::on_btnCloseServer_clicked() {if (m_WebSocketServer) {if (m_WebSocketServer->isListening()) {m_WebSocketServer->close();ui.btnOpenServer->setEnabled(true);ui.textEdit_RecvMsg->append(u8"服务关闭");}}
}// 处理新的客户端连接
void WebsocketServerDemo::onNewConnection() {pSocket = m_WebSocketServer->nextPendingConnection();m_clients << pSocket;// 处理接到消息的信号connect(pSocket, SIGNAL(textMessageReceived(QString)), this, SLOT(processTextMessage(QString)));// 处理断线的信号connect(pSocket, SIGNAL(disconnected()), this, SLOT(socketDisconnected()));QString peerName = pSocket->requestUrl().toString();cout << "peerName = " << peerName.toStdString() << endl;// 将 ip 和 socket 保存到 mapmapSocket[peerName] = pSocket;ui.listWidget_OnlineUser->addItem(peerName);
}// 处理接收到的消息
void WebsocketServerDemo::processTextMessage(QString message) {QString time = current_date_time->currentDateTime().toString("yyyy.MM.dd hh:mm:ss.zzz ddd");QString item = pSocket->requestUrl().toString();ui.textEdit_RecvMsg->append(time + "" + item + "\n" + message);// 处理消息转发//...
}// 客户端连接断开的操作
void WebsocketServerDemo::socketDisconnected() {for (auto sk : m_clients) {if (!sk->isValid()) {QString temp_key;ui.textEdit_RecvMsg->append("map size = " + QString(mapSocket.size()) + "\n");for (auto it = mapSocket.begin(); it!=mapSocket.end(); it++) {if (it.value() == sk) {// 删除项QList<QListWidgetItem*> list;list = ui.listWidget_OnlineUser-> findItems(it.key(), Qt::MatchCaseSensitive);QListWidgetItem* sel = list[0];int r = ui.listWidget_OnlineUser->row(sel);QListWidgetItem* item = ui.listWidget_OnlineUser->takeItem(r);ui.listWidget_OnlineUser->removeItemWidget(item);delete item;m_clients.removeOne(sk);QString time = current_date_time->currentDateTime().toString("yyyy.MM.dd hh:mm:ss.zzz ddd");ui.textEdit_RecvMsg->append(time + "" + it.key() + "下线了\n");temp_key = it.key();}}mapSocket.remove(temp_key);ui.textEdit_RecvMsg->append("after remove, map size = " + QString(mapSocket.size()) + "\n");}}
}// 群发消息
void WebsocketServerDemo::on_btnSend_clicked() {QString msg = ui.textEdit_send->document()->toPlainText();for (auto sk : m_clients) {sk->sendTextMessage(msg);}
}

6.3 C++ Qt 实现 websocket client

在这里插入图片描述

  • WebSocketClientDemo.h
#pragma once#include <QtWidgets/QWidget>
#include "ui_WebSocketClientDemo.h"
#include <QLineEdit>
#include <QLabel>
#include <QTextEdit>
#include <QListWidget>
#include <QPushButton>
#include <QSpinBox>
#include <QButtonGroup>
#include <QObject>
#include <QWidget>
#include <QUrl>
#include <time.h>
#include <QByteArray>
#include <QWebSocket>class WebSocketClientDemo : public QWidget {Q_OBJECTpublic:WebSocketClientDemo(QWidget *parent = Q_NULLPTR);~WebSocketClientDemo();private slots:void on_btnConnect_clicked();void on_btnDisconnect_clicked();void on_btnSend_clicked();void onconnected();void onTextMessageReceived(const QString& message);void closeConnection();    private:Ui::WebSocketClientDemoClass ui;QUrl m_url;QWebSocket m_websocket;bool m_debug;QDateTime* current_date_time;
};
  • WebSocketClientDemo.cpp
#include "WebSocketClientDemo.h"
#include <QLabel>
#include <QWidget>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QtCore>
#include <QDebug>
#include <iostream>
#include <string>using namespace std;WebSocketClientDemo::WebSocketClientDemo(QWidget *parent) : QWidget(parent) {ui.setupUi(this);ui.lineEdit_URL->setText("ws://192.168.74.1:8000/topic=10001");ui.label_ConnectStatus->clear();connect(&m_websocket, SIGNAL(connected()), this, SLOT(onconnected()));connect(&m_websocket, SIGNAL(disconnected()), this, SLOT(closeConnection()));connect(&m_websocket, SIGNAL(textMessageReceived(QString)), this, SLOT(onTextMessageReceived(QString)));
}WebSocketClientDemo::~WebSocketClientDemo() {m_websocket.errorString();m_websocket.close();
}// 断开连接操作
void WebSocketClientDemo::closeConnection()  {   ui.label_ConnectStatus->setText("disconnected");
}// 连接服务器
void WebSocketClientDemo::on_btnConnect_clicked() {QString _text = ui.lineEdit_URL->text();QUrl url = QUrl(_text);m_websocket.open(url);
}// 连接上之后
void WebSocketClientDemo::onconnected() {ui.label_ConnectStatus->setText(tr("connected"));ui.btnConnect->setEnabled(false);ui.btnDisconnect->setEnabled(true);
}// 收到消息
void WebSocketClientDemo::onTextMessageReceived(const QString& message) {QString time = current_date_time->currentDateTime().toString("yyyy.MM.dd hh:mm:ss.zzz ddd");ui.textEdit_recv->setText(time + "\n" + message);
}// 断开
void WebSocketClientDemo::on_btnDisconnect_clicked() {m_websocket.close();
}// 发送消息
void WebSocketClientDemo::on_btnSend_clicked() {QString msg = ui.textEdit_send->document()->toPlainText();string dataMsg = R"("sender":"10002","receiver":"10001","msg":"你好")";m_websocket.sendTextMessage(msg);
}

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

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

相关文章

Peoeasy机器人:原点无法重置问题

机械手在伺服关闭的模式下&#xff0c;插入定位插销&#xff0c;进入机构设定重置原点&#xff0c;发现PUU值没有变化 问题原因 台达软件版本比较多&#xff0c;每个版本重置原点的模式和马达偏差角的默认值是有一定差异的。再重置原点之前尽可能先确认一下重置原点的模式和马…

云服务器如何选?腾讯云2核2G3M云服务器88元一年!

作为一名程序员&#xff0c;在选择云服务器时&#xff0c;我们需要关注几个要点&#xff1a;网络稳定性、价格以及云服务商的规模。这些要素将直接影响到我们的使用体验和成本效益。接下来&#xff0c;我将为大家推荐一款性价比较高的轻应用云服务器。 腾讯云双11活动 腾讯云…

【计算思维】少儿编程蓝桥杯青少组计算思维题考试真题及解析B

STEMA考试-计算思维-U8级(样题) 1.浩浩的左⼿边是&#xff08; &#xff09;。 A.兰兰 B.⻉⻉ C.⻘⻘ D.浩浩 2.2时30分&#xff0c;钟⾯上时针和分针形成的⻆是什么⻆&#xff1f;&#xff08; &#xff09; A.钝⻆ B.锐⻆ C.直⻆ D.平⻆ 3.下⾯是⼀年级同学最喜欢的《⻄游记》…

SystemVerilog学习 (5)——接口

一、概述 验证一个设计需要经过几个步骤&#xff1a; 生成输入激励捕获输出响应决定对错和衡量进度 但是&#xff0c;我们首先需要一个合适的测试平台&#xff0c;并将它连接到设计上。 测试平台包裹着设计,发送激励并且捕获设计的输出。测试平台组成了设计周围的“真实世界”,…

c语言从入门到实战——数组指针与函数指针

数组指针与函数指针 前言1. 字符指针变量2. 数组指针变量2.1 数组指针变量是什么&#xff1f;2.2 数组指针变量怎么初始化? 3. 二维数组传参的本质4. 函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 两段有趣的代码4.3.1 typedef关键字 5. 函数指针数组6. 转移…

VScode+python开发,多个解释器切换问题

内容&#xff1a;主要VScode使用多个解释器 环境准备 VScode编辑器&#xff0c;两个版本python解释器 python3.7.2 python3.11.6 问题&#xff1a; 目前我们的电脑安装了python3.7.2、python3.11.6两个解释器&#xff0c;在vscode编辑器中&#xff0c;无法切换解释器使用如…

泛微E9,独立选择框对应数据库表查询

泛微E9&#xff0c;独立选择框对应数据库表查询 文章目录 泛微E9&#xff0c;独立选择框对应数据库表查询步骤一&#xff1a;准备姓名、姓名文本字段&#xff1a;步骤二&#xff1a;获取选择框字段的id&#xff1a;其他 需求描述&#xff1a;假如流程表单有两个字段&#xff0c…

SpringBoot和Spring源码下载

1.下载&#xff1a;在一个空的干净地创建一个文件夹叫springsourcecode&#xff0c;其实叫什么都行的。 git clone https://github.com/spring-projects/spring-framework.git 2.JDK要和gradle匹配 我们要21的&#xff0c;今天为止2023年11月13日&#xff0c;idea是2023.2。 …

ChatGLM3-6B:新一代开源双语对话语言模型,流畅对话与低部署门槛再升级

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

PM2学习

目录 PM2简介 pm2的主要特性 PM2安装 启动PM2项目 查看应用列表&#xff08;查看当前机器执行的所有进程&#xff09; 查看某个应用详情 重启 停止 删除 日志查看 负载均衡 监控CPU/内存 内存使用超过上限自动重启 监听代码变化/自动重启 PM2简介 PM2是常用的node…

虹科示波器 | 汽车免拆检修 | 2014款保时捷卡宴车行驶中发动机偶尔自动熄火

一、故障现象 一辆2014款保时捷卡宴车&#xff0c;搭载4.8L自然吸气发动机&#xff0c;累计行驶里程约为10.3万km。车主反映&#xff0c;行驶中发动机偶尔自动熄火&#xff0c;尤其在减速至停车的过程中故障容易出现。 二、故障诊断 接车后路试&#xff0c;确认故障现象与车主所…

tcpdump wireshark简单使用

tcpdump工作原理 tcpdump 是 Linux 系统中非常有用的网络工具&#xff0c;运行在用户态&#xff0c;本质上是通过调用 libpcap 库的各种 api 来实现数据包的抓取功能&#xff0c;利用内核中的 AF_PACKET 套接字&#xff0c;抓取网络接口中传输的网络包。查 看 tcpdump 的 手册…

《网络协议》06. HTTP 补充 · HTTPS · SSL/TLS

title: 《网络协议》06. HTTP 补充 HTTPS SSL/TLS date: 2022-10-06 18:09:55 updated: 2023-11-15 07:53:52 categories: 学习记录&#xff1a;网络协议 excerpt: HTTP/1.1 协议的不足、HTTP/2、HTTP/3、HTTP 协议的安全问题、SPDY、HTTPS、SSL/TLS、OpenSSL。 comments: fa…

2023年09月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 阅读以下代码,程序输出结果正确的选项是?( ) def process_keywords(keywords_list):unique_keywords = list(set(keywords_list))

SQL练习---619.出现一次的最大数字

题目 分析 首先确定表的来源只有一个表数字表&#xff0c;再者判断他是不是单一数字&#xff0c;&#xff08;想到的是直接按数字分组&#xff0c;通过count函数来判断是否为单一数子&#xff09;&#xff0c;然后求最大值。 题解 select Max(num) as num from MyNumbers wh…

Facebook个人主页和公共主页的区别

Facebook个人主页和公共主页是两种不同类型的页面&#xff0c;它们在功能、用途和管理方面上都是存在着一些明显的区别。本文小编则对他们的区别介绍一下。 首先&#xff0c;个人主页是供普通用户使用的&#xff0c;用于展示个人信息和与朋友、家人保持联系。个人主页通常包括…

Prometheus+Ansible+Consul实现服务发现

一、简介 1、Consul简介 Consul 是基于 GO 语言开发的开源工具&#xff0c;主要面向分布式&#xff0c;服务化的系统提供服务注册、服务发现和配置管理的功能。Consul 提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能。 在没有使用 consul 服…

P6入门:项目初始化11-项目详情之计算Calculations

前言 使用项目详细信息查看和编辑有关所选项目的详细信息&#xff0c;在项目创建完成后&#xff0c;初始化项目是一项非常重要的工作&#xff0c;涉及需要设置的内容包括项目名&#xff0c;ID,责任人&#xff0c;日历&#xff0c;预算&#xff0c;资金&#xff0c;分类码等等&…

基于PyTorch搭建你的生成对抗性网络

前言 你听说过GANs吗&#xff1f;还是你才刚刚开始学&#xff1f;GANs是2014年由蒙特利尔大学的学生 Ian Goodfellow 博士首次提出的。GANs最常见的例子是生成图像。有一个网站包含了不存在的人的面孔&#xff0c;便是一个常见的GANs应用示例。也是我们将要在本文中进行分享的…

深入理解 pytest Fixture 方法及其应用!

当涉及到编写自动化测试时&#xff0c;测试框架和工具的选择对于测试用例的设计和执行非常重要。在Python 中&#xff0c;pytest是一种广泛使用的测试框架&#xff0c;它提供了丰富的功能和灵活的扩展性。其中一个很有用的功 能是fixture方法&#xff0c;它允许我们初始化测试环…