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

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);
}

相关文章:

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

1. http 基础 HTTP 基础教程C Web 框架 drogonoatpp 2. C Qt 用户登录、注册功能实现 login_register.h #pragma once#include <QtWidgets/QDialog> #include "ui_login_register.h" #include <QNetworkReply>class login_register : public QDialog…...

38 路由的过滤器配置

3.3.断言工厂 我们在配置文件中写的断言规则只是字符串&#xff0c;这些字符串会被Predicate Factory读取并处理&#xff0c;转变为路由判断的条件 例如Path/user/**是按照路径匹配&#xff0c;这个规则是由 org.springframework.cloud.gateway.handler.predicate.PathRoute…...

3分钟带你了解前端缓存-HTTP缓存

前情提要 前端缓存分为下面三大类&#xff0c;本文主要讲解HTTP缓存~ 1. HTTP缓存 强缓存协商缓存 2. 浏览器缓存 本地小容量缓存本地大容量缓存 3. 应用程序缓存 HTML5应用程序缓存 缓存作用 减少了冗余的数据传输减少服务器的负担提高了网站的性能加快加载网页速度 …...

【多线程 - 03、线程的生命周期】

生命周期 当线程被创建并启动以后&#xff0c;它不是一启动就进入执行状态&#xff0c;也不会一直处于执行状态&#xff0c;而是会经历五种状态。 线程状态的五个阶段&#xff1a; 新建状态&#xff08;New&#xff09;就绪状态&#xff08;Runnable&#xff09;运行状态&…...

excel表的筛选后自动求和

一般都使用subtotal函数。 通过看一个大佬的视频&#xff0c;发现可以有更简单的方法。 首先任意筛选数据(ctrlshiftl)&#xff0c; 然后选中需要求和的列的最下方的空白单元格&#xff0c;再按alt。 回车即可。 实质它还是用的subtotal函数...

2311rust特征

Rust无成本抽象 Rust中抽象基石是trait: 1,Trait是Rust中唯一的接口概念.多个类型可实现一个特征,事实上,可为现有类型提供新的特征实现.另一方面,想抽象未知类型时,找特征就行了. 2,与C模板一样,可静态分发特征. 3,可动态分发特征.有时确实需要间接,所以不必运行时"擦除…...

原型模式 rust和java的实现

文章目录 原型模式介绍优点缺点使用场景 实现java 实现rust 实现 rust代码仓库 原型模式 原型模式&#xff08;Prototype Pattern&#xff09;是用于创建重复的对象&#xff0c;同时又能保证性能。 这种模式是实现了一个原型接口&#xff0c;该接口用于创建当前对象的克隆。当…...

阿里云ACK(Serverless)安装APISIX网关及APISIX Ingress Controller

在k8s上安装apisix全家&#xff0c;通过helm安装很简单&#xff0c;但是会遇到一些问题。 安装 首先登录阿里云控制台&#xff0c;在ACK集群详情页&#xff0c;进入CloudShell&#xff0c;执行下面helm命令安装apisix、apisix-ectd、apisix-dashboard和apisix-ingress-contro…...

vue+mongodb+nodejs实现表单增删改查

ExpressMongodbVue实现增删改查 效果图 前言 最近一直想学下node,毕竟会node的前端更有市场。但是光看不练&#xff0c;感觉还是少了点什么&#xff0c;就去github上看别人写的项目&#xff0c;收获颇丰&#xff0c;于是准备自己照葫芦画瓢写一个。 作为程序员&#xff0c;一…...

SpringBootWeb案例——Tlias智能学习辅助系统(3)——登录校验

前一节已经实现了部门管理、员工管理的基本功能。但并没有登录&#xff0c;就直接访问到了Tlias智能学习辅助系统的后台&#xff0c;这节来实现登录认证。 目录 登录功能登录校验(重点)会话技术会话跟踪方案一 Cookie&#xff08;客户端会话跟踪技术&#xff09;会话跟踪方案二…...

hive和spark-sql中 日期和时间相关函数 测试对比

测试版本&#xff1a; hive 2.3.4 spark 3.1.1 hadoop 2.7.7 1、增加月份 add_months(timestamp date, int months)add_months(timestamp date, bigint months)Return type: timestampusage:add_months(now(),1) 2、增加日期 adddate(timestamp startdate, int days)…...

Cell和RefCell

Cell和RefCell CellRefCellRefCell在运行时记录借用结合Rc和RefCell来拥有多个可变数据所有者引用循环与内存泄漏制造引用循环避免引用循环&#xff1a;将Rc变为Weak创建树形数据结构&#xff1a;带子节点的Node增加从子到父的引用可视化strong_count 和 weak_count 的改变 Rus…...

DaoWiki(基于Django)开发笔记 20231113

DaoWiki&#xff08;基于Django&#xff09;开发笔记 20231113 开发环境 操作系统 windows11python版本 3.12.0django版本 4.2.7 构建python虚拟环境 python -m venv daowiki启动python虚拟环境 cd daowiki\Scripts .\activate安装Django pip install django4.2.7创建项目…...

照片放大软件 Topaz Gigapixel AI mac中文版简介

Topaz Gigapixel AI mac是一款使用人工智能功能扩展图像的桌面应用程序&#xff0c;同时添加自然细节以获得惊人的效果。使用深度学习技术&#xff0c;A.I.Gigapixel™可以放大图像并填写其他调整大小的产品遗漏的细节&#xff0c;使用A.I.Gigapixel™&#xff0c;您可以裁剪照…...

某手游完整性校验分析

前言 只是普通的单机手游&#xff0c;广告比较多&#xff0c;所以分析处理了下&#xff0c;校验流程蛮有意思的&#xff0c;所以就分享出来了 1.重打包崩溃处理 样本进行了加固&#xff0c;对其dump出dex后重打包出现崩溃 ida分析地址发现为jni函数引起 利用Xposed直接替换…...

【ElasticSearch】学习使用DSL和RestClient编写查询语句

文章目录 DSL和RestClient的学习前言1、DSL查询文档1.1 查询分类1.2 全文检索查询1.21 全文检索概述1.2.2 基本使用 1.3 精确查询1.3.1 term查询1.3.2 range查询 1.4 地理坐标查询1.4.1 geo_bounding_box查询1.4.2 geo_distance查询 1.5 复合查询1.5.1 常见相关性算法1.5.2 算分…...

asp.net外卖网站系统VS开发mysql数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net外卖网站系统 是一套完善的web设计管理系统&#xff0c;系统采用mvc模式&#xff08;BLLDALENTITY&#xff09;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为mysql&#xff0c;使用c#语…...

2.4.0 Milky Way 强势登场!新功能大爆炸,让你High翻全场!

Yo开发达人们&#xff0c;我们有重磅新功能要给你们放送啦&#xff01; Check it out 数据汇总不再单调&#xff0c;新的聚合函数登场&#xff01; compact_state_agg #1359gauge_agg #1370first #1395last #1413mode #1440increase #1476delta #1395time_delta #1405rate #14…...

C语言----静态链接库和动态链接库

在前面的文章中讲到可执行程序的生成需要经过预处理&#xff0c;编译&#xff0c;汇编和链接四个步骤&#xff0c;链接阶段是链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。 需要解读一下库文件&#xff0c;我们可以将库文件等价为压缩包文件&…...

PCA(主成分分析)数据降维技术代码详解

引言 随着大数据时代的到来&#xff0c;我们经常会面临处理高维数据的问题。高维数据不仅增加了计算复杂度&#xff0c;还可能引发“维度灾难”。为了解决这一问题&#xff0c;我们需要对数据进行降维处理&#xff0c;即在不损失太多信息的前提下&#xff0c;将数据从高维空间…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...