qt实现一个简单http服务器和客户端
一、功能简介
服务器:
登录功能、下载文件功能
客户端:
登录功能、下载文件功能、上传成绩功能
二、服务器代码
//HttpServer.h
#ifndef HTTPSERVER_H
#define HTTPSERVER_H#include <QMainWindow>
#include <QTcpSocket>
#include <QTcpServer>
#include <QJsonDocument>
#include <QJsonObject>
#include <QFile>
#include <QString>
#include <QCoreApplication>
#include <QDir>
class Server:public QTcpServer
{
//http服务器类Q_OBJECT
public:Server(QObject *parent = nullptr) : QTcpServer(parent) {}
signals:
//信号函数
//自定义信号函数,发送信号,将信息显示在界面类上的textedit中void login_success(QString str);void login_faild(QString str);void download_success(QString str);void download_faild(QString str);void upload_success(QString str);
protected:void incomingConnection(qintptr socketDescriptor) override {QTcpSocket *socket = new QTcpSocket(this);socket->setSocketDescriptor(socketDescriptor);connect(socket, &QTcpSocket::readyRead, this, [this, socket]() {handleRequest(socket);});}
private:void handleRequest(QTcpSocket *socket){QString request = socket->readAll();QStringList lines = request.split("\r\n");QString requestLine = lines[0];QStringList requestParts = requestLine.split(" ");QString method = requestParts[0];QString path = requestParts[1];if (method == "POST" && path == "/login") {handleLogin(socket, request);} else if (method == "GET" && path == "/download") {handleDownload(socket);} else if (method == "POST" && path == "/upload") {handleUpload(socket, request);} else {sendResponse(socket, 404, "Not Found");}}void handleLogin(QTcpSocket *socket, const QString &request){// 解析请求体QString body = request.split("\r\n\r\n").last();QJsonDocument doc = QJsonDocument::fromJson(body.toUtf8());QJsonObject json = doc.object();QString username = json["username"].toString();QString password = json["password"].toString();// 简单验证if (username == "admin" && password == "123456") {sendResponse(socket, 200, "Login Success");emit login_success(username+":"+"Login Success!");//ui->textEdit->append(username+":"+"Login Success!");} else {sendResponse(socket, 401, "Login Failed");emit login_faild(username+":"+"Login Failed!");//ui->textEdit->append(username+":"+"Login Failed!");}}void handleDownload(QTcpSocket *socket){// 获取应用程序的当前目录QString appDir = QCoreApplication::applicationDirPath();// 构建文件的完整路径QString filePath = QDir(appDir).filePath("test.txt");QFile file(filePath);if (file.open(QIODevice::ReadOnly)) {QByteArray data = file.readAll();sendResponse(socket, 200, data);file.close();emit upload_success("download Success!");} else {emit upload_success("download Failed!");sendResponse(socket, 404, "File Not Found");}}void handleUpload(QTcpSocket *socket, const QString &request){QString body = request.split("\r\n\r\n").last();QJsonDocument doc = QJsonDocument::fromJson(body.toUtf8());QJsonObject json = doc.object();QString chinese = json["chinese"].toString();QString math = json["math"].toString();QString english = json["english"].toString();// 简单处理,打印上传的数据emit upload_success("语文:"+chinese+";"+"数学:"+math+";"+"英语:"+english);qDebug() << "语文:" << chinese << "数学:" << math << "英语:" << english;sendResponse(socket, 200, "Upload Success");}void sendResponse(QTcpSocket *socket, int statusCode, const QByteArray &body){QString response = QString("HTTP/1.1 %1 OK\r\n""Content-Type: text/plain\r\n""Content-Length: %2\r\n""\r\n""%3").arg(statusCode).arg(body.size()).arg(QString(body));socket->write(response.toUtf8());socket->disconnectFromHost();}};QT_BEGIN_NAMESPACE
namespace Ui {
class HttpServer;
}
QT_END_NAMESPACEclass HttpServer : public QMainWindow
{
//http服务器界面类Q_OBJECTpublic:HttpServer(QWidget *parent = nullptr);~HttpServer();private:Ui::HttpServer *ui;Server* m_server;
};
#endif // HTTPSERVER_H
//HttpServer.cpp
#include "httpserver.h"
#include "ui_httpserver.h"HttpServer::HttpServer(QWidget *parent): QMainWindow(parent), ui(new Ui::HttpServer)
{ui->setupUi(this);m_server= new Server();m_server->listen(QHostAddress::Any,8080);connect(m_server,&Server::login_success,this,[=](QString str){ui->textEdit->append(str);});connect(m_server,&Server::login_faild,this,[=](QString str){ui->textEdit->append(str);});connect(m_server,&Server::download_success,this,[=](QString str){ui->textEdit->append(str);});connect(m_server,&Server::download_faild,this,[=](QString str){ui->textEdit->append(str);});connect(m_server,&Server::upload_success,this,[=](QString str){ui->textEdit->append(str);});
}
HttpServer::~HttpServer()
{delete ui;
}
三、客户端代码
//HttpClient.h
#ifndef HTTPCLIENT_H
#define HTTPCLIENT_H#include <QMainWindow>
#include<QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QJsonDocument>
#include <QJsonObject>
#include <QFile>
#include <QDebug>
#include <QPushButton>QT_BEGIN_NAMESPACE
namespace Ui {
class HttpClient;
}
QT_END_NAMESPACEclass HttpClient : public QMainWindow
{Q_OBJECTpublic:HttpClient(QWidget *parent = nullptr);~HttpClient();
private:Ui::HttpClient *ui;QNetworkAccessManager *manager;
private slots:void login( );void downloadFile( );void uploadScore( );
};
#endif // HTTPCLIENT_H
//HttpClient.cpp
#include "httpclient.h"
#include "ui_httpclient.h"HttpClient::HttpClient(QWidget *parent): QMainWindow(parent), ui(new Ui::HttpClient)
{ui->setupUi(this);manager=new QNetworkAccessManager;connect(ui->pb_login,&QPushButton::clicked,this,&HttpClient::login);connect(ui->pu_down,&QPushButton::clicked,this,&HttpClient::downloadFile);connect(ui->pb_upload,&QPushButton::clicked,this,&HttpClient::uploadScore);
}
void HttpClient::login()
{QUrl url("http://127.0.0.1:8080/login");QNetworkRequest request(url);request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");QJsonObject json;json["username"] = ui->li_name->text();//adminjson["password"] = ui->li_pswd->text();//123456QNetworkReply *reply = manager->post(request, QJsonDocument(json).toJson());QObject::connect(reply, &QNetworkReply::finished, [reply]() {if (reply->error() == QNetworkReply::NoError) {qDebug() << "Login Response:" << reply->readAll();} else {qDebug() << "Login Error:" << reply->errorString();}reply->deleteLater();});
}
void HttpClient::downloadFile()
{QUrl url("http://127.0.0.1:8080/download");QNetworkRequest request(url);QNetworkReply *reply = manager->get(request);QObject::connect(reply, &QNetworkReply::finished, [reply]() {if (reply->error() == QNetworkReply::NoError) {QByteArray data = reply->readAll();QFile file("D:\\Project\\qtcreator\\HttpClient\\downloaded.txt");if (file.open(QIODevice::WriteOnly)) {file.write(data);file.close();qDebug() << "File downloaded successfully!";}} else {qDebug() << "Download Error:" << reply->errorString();}reply->deleteLater();});
}
void HttpClient::uploadScore()
{QUrl url("http://127.0.0.1:8080/upload");QNetworkRequest request(url);request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");QJsonObject json;json["chinese"] = ui->li_chinese->text();json["math"] =ui->li_math->text();json["english"] = ui->li_english->text();QNetworkReply *reply = manager->post(request, QJsonDocument(json).toJson());QObject::connect(reply, &QNetworkReply::finished, [reply]() {if (reply->error() == QNetworkReply::NoError) {qDebug() << "Upload Response:" << reply->readAll();} else {qDebug() << "Upload Error:" << reply->errorString();}reply->deleteLater();});
}
HttpClient::~HttpClient()
{delete ui;
}
四、其他设置
1.不管是服务器还是客户端,都要在.pro文件中添加 network
QT += core gui network
2.保证在httpserver.exe目录下有text.txt文件
五、测试
分别运行服务器与客户端程序
1.登录功能
客户端输入用户名与密码,点击登录
2.下载功能
3.上传功能
六、追加python测试
1.下载库(pip install requests)
import requests# 服务器地址和端口
SERVER_URL = "http://localhost:8080"def test_login():"""测试用户登录接口"""url = f"{SERVER_URL}/login"data = {"username": "admin","password": "123456"}response = requests.post(url, json=data)# 验证响应if response.status_code == 200:print("Login Test: PASSED")else:print(f"Login Test: FAILED (Status Code: {response.status_code}, Response: {response.text})")def test_download():"""测试文件下载接口"""url = f"{SERVER_URL}/download"response = requests.get(url)# 验证响应if response.status_code == 200:print("Download Test: PASSED")print("File Content:")print(response.text) # 打印文件内容else:print(f"Download Test: FAILED (Status Code: {response.status_code}, Response: {response.text})")def test_upload():"""测试成绩上传接口"""url = f"{SERVER_URL}/upload"data = {"chinese": "80","math": "90","english": "79"}response = requests.post(url, json=data)# 验证响应if response.status_code == 200:print("Upload Test: PASSED")else:print(f"Upload Test: FAILED (Status Code: {response.status_code}, Response: {response.text})")def run_tests():"""运行所有测试"""print("Running Tests...")test_login()test_download()test_upload()print("All Tests Completed.")if __name__ == "__main__":run_tests()
3.结果
相关文章:
qt实现一个简单http服务器和客户端
一、功能简介 服务器: 登录功能、下载文件功能 客户端: 登录功能、下载文件功能、上传成绩功能 二、服务器代码 //HttpServer.h #ifndef HTTPSERVER_H #define HTTPSERVER_H#include <QMainWindow> #include <QTcpSocket> #include <QTc…...
深入理解Linux网络随笔(五):深度理解本机网络I/O
深入理解Linux网络随笔(五):深度理解本机网络I/O 文章目录 深入理解Linux网络随笔(五):深度理解本机网络I/O本机发送过程本机接收过程总结 分析本机网络I/O部分源码需要知道本机I/O是什么?扮演什…...
Debian12生产环境配置笔记
在 Debian 12 上进行生产环境配置的详细步骤,涵盖软件更新、基础软件安装、Docker 及 Redis 部署,以及 Nginx 配置多个虚拟主机等内容。所有命令均以 root 用户身份执行,无需添加 sudo 1. 更新软件 首先,确保系统上的所有软件包…...
工业物联网的范式革命:从“云边“ 到“边边” 协的技术跃迁
基于DIOS操作系统的去中心化重构 一、云边协同模式的局限性:技术瓶颈与成本困局 当前工业物联网主流的云边协同架构(Cloud-Edge Collaboration)已暴露出显著短板,其核心问题源于对中心云的过度依赖: 带宽资源挤占与…...
python学习笔记--实现简单的爬虫(二)
任务:爬取B站上最爱欢迎的编程课程 网址:编程-哔哩哔哩_bilibili 打开网页的代码模块,如下图: 标题均位于class_"bili-video-card__info--tit"的h3标签中,下面通过代码来实现,需要说明的是URL中…...
【蓝桥杯速成】| 8.回溯算法
因为在进行背包问题的练习时,发现很多题目需要回溯,但本人作为小白当然是啥也不知道 那么就先来补充一下回溯算法的知识点,再进行练习 理论基础 回溯算法本质上是一种递归函数,是纯暴力搜索方法, 适合组合问题、排列…...
聚水潭商品信息集成MySQL的高效解决方案
聚水潭商品信息集成到MySQL的技术案例分享 在数据驱动的业务环境中,如何高效、准确地将聚水潭系统中的商品信息集成到MySQL数据库,是许多企业面临的重要挑战。本文将详细介绍一个实际运行的方案——“聚水潭-商品信息查询-->BI崛起-商品信息表_copy”…...
【数学建模】多目标规划模型:原理、方法与应用
多目标规划模型:原理、方法与应用 文章目录 多目标规划模型:原理、方法与应用引言1. 多目标规划的基本概念1.1 数学模型1.2 Pareto最优解/有效解1.3 满意解方法 2. 多目标规划的主要求解方法2.1 加权求和法2.2 ε-约束法2.3 理想点法2.4 优先级法&#x…...
基于Spring Boot的党员学习交流平台的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
Flink CDC 与 SeaTunnel CDC 简单对比
Flink CDC 与 SeaTunnel CDC 简单对比 CDC 技术概述 变更数据捕获(Change Data Capture,简称 CDC)是一种用于捕获数据库中数据变更的技术,能够实时识别、捕获并输出数据库中的插入、更新和删除操作。CDC 技术在现代数据架构中扮…...
ARM 汇编基础
ARM 汇编是嵌入式开发、操作系统底层编程和性能优化的核心技能之一。以下是一份系统的 ARM 汇编指令教学指南,涵盖基础语法、核心指令、编程模式和实用示例。 1. ARM 汇编基础 1.1 寄存器 ARM 架构(32位)包含 16 个通用寄存器&…...
【嵌入式狂刷100题】- 1基础知识部分
准备新开专栏【嵌入式狂刷100题】😶🌫️😶🌫️🤧加油!!!,内容包括 基础知识部分操作系统部分处理器架构部分外设驱动部分通信协议部分存储器管理部分硬件设计部分多媒体部分调试故障排除部分编码开发部…...
【模板】计算几何入门
来源 计算几何基本模板(二维) 目录 基本设置点 向量 Point(Vector)点积(数量积、内积)向量积,叉积两点间距离向量的模单位向量两向量的夹角判断点在直线的哪边逆转角 线 直线表达式Line判断…...
PostgreSQL 数据库中导入大量数据
在 PostgreSQL 数据库中导入大量数据,可根据数据来源和格式选择不同的方法。以下为你详细介绍几种常见的方式: 1. 使用 COPY 命令(适用于本地数据文件) COPY 命令是 PostgreSQL 内置的高效数据导入工具,适合处理本地的数据文件。 步骤 准备数据文件 确保你的数据文件格…...
DeepSeek和Kimi在Neo4j中的表现
以下是2个最近爆火的人工智能工具, DeepSeek:DeepSeek Kimi: Kimi - 会推理解析,能深度思考的AI助手 1、提示词: 你能帮我生成一个知识图谱吗,等一下我会给你一篇文章,帮我从内容中提取关键要素,然后以N…...
xQueueSendToBack的中文释义和裸机调用
如果不在 FreeRTOS 环境下运行,而是裸机环境中实现类似的功能,需要移除 xQueueSendToBack 的依赖,并直接调用 CAN 发送函数。以下是修改后的代码和实现思路: 1. FreeRTOS 中的 xQueueSendToBack 功能 作用:将消息发送…...
2025年- G24-Lc98-217.包含重复(使用hashSet解决)-java版
1.题目描述 2.思路 思路一: 我的想法是直接用集合来判断,如果集合的元素不能添加说明之前已经存在这个元素,也就是发现了重复元素,所以返回false。 补充一: Map、ArrayList的定义和声明 3.代码实现 class Soluti…...
【树莓派驱动验证步骤】
终端操作和输出: 清理项目 adaraspberrypi:~/mt3502 $ make clean make -C /lib/modules/6.6.51rpt-rpi-v8/build M/home/ada/mt3502 clean make[1]: 进入目录“/usr/src/linux-headers-6.6.51rpt-rpi-v8”CLEAN /home/ada/mt3502/Module.symvers make[1]: 离开…...
百度SEO和必应SEO优化方法
如需SEO服务,可以搜索:深圳市信科网络科技有限公司。 一、搜索引擎生态格局:流量入口的重新洗牌 2025 年,中国 PC 端搜索引擎市场正经历戏剧性变革。StatCounter 数据显示,必应凭借 Edge 浏览器的预装优势与 ChatGPT …...
2025年3月AI搜索发展动态与趋势分析:从技术革新到生态重构
025年3月AI搜索发展动态与趋势分析:从技术革新到生态重构 一、行业动态:巨头布局与技术升级 谷歌推出“AI模式”,重新定义搜索体验 谷歌上线全新“AI模式”,集成多模态交互与实时数据能力,用户可通过文本、图片或语音…...
封闭图形个数
0封闭图形个数 - 蓝桥云课 小蓝对蓝桥王国的数字大小规则十分感兴趣。现在,他将给定你n个数a1, a2, ..., an,请你按照蓝桥王国的数字大小规则,将这n数从小到大排序,并输出排序后结果。 输入格式 第一行包含一个整数n࿰…...
VSCode 抽风之 两个conda环境同时在被激活
出现了神奇的(toolsZCH)(base) 提示符,如下图所示: 原因大概是:conda 环境的双重激活:可能是 conda 环境没有被正确清理或初始化,导致 base 和 toolsZCH 同时被激活。 解决办法就是 :conda deactivate 两次…...
Django 生产环境静态文件处理
python manage.py collectstatic 是 Django 提供的一个非常重要的管理命令,用于将项目中的静态文件收集到一个指定的目录中。这在部署 Django 项目时尤其重要,因为静态文件需要被 Web 服务器(如 Nginx 或 Apache)提供服务…...
语法: result=frexp(value, exp);
FREXP()是C语言里的内部函数,根据需要了解。 语法: resultfrexp(value, &exp); 参数: value是一个浮点数; exp是一个有符号的整型数; 返回值: 返回值result是一个浮点数,其有效范围是 0.5(含)到 1.0(不含&…...
ArcGIS Pro 制作风台路径图:从数据到可视化
一、引言 台风,作为自然界极具破坏力的气象现象之一,其路径的精准预测与直观呈现对于防灾减灾工作至关重要。 在数字化时代,借助专业的地理信息系统(GIS)软件,如 ArcGIS Pro,我们能够高效地将…...
#pandas #python#数据标注 pd.crosstab()
题目: device_status.txt 存储了工业互联网平台上收集的设备运行状态数据,数 据中有以下内容: device_id:设备编号,字符串类型,长度为 8 status_time:状态时间,日期时间类型&…...
self Attention为何除以根号dk?(全新角度)
全网最独特解析:self Attention为何除根号dk? 一、假设条件:查询向量和键向量服从正态分布 假设查询向量 q i q_i qi和键向量 k j k_j kj的每个分量均为独立同分布的随机变量,且服从标准正态分布,即:…...
SpringBoot @Scheduled注解详解
Scheduled 是 Spring Framework 中用于实现定时任务的核心注解,能够方便地配置方法在特定时间或周期执行。以下是详细解析: 1. 启用定时任务 在 Spring Boot 中,需在配置类添加 EnableScheduling 注解以启用定时任务支持: Co…...
在大数据开发中spark是指什么?
hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字经济蓬勃发展的今天,数据已成为驱动商业决策、科学研究和城市治理的核心燃料。面对…...
从点灯开始的51单片机生活
陵谷纷纭新事改,筑台土石未应迟。 目录 sfr与sbit?不靠定时器的delay_ms延时函数所谓寄存器 sfr与sbit? 这第一课咱们主要来先理解一下sfr与sbit,以下可能是咱们这些新手朋友常见的点灯代码: #include<regx52.h&g…...
AI大模型落地:昆仑技术的东方解法
DeepSeek的横空出世,一举打破“算力封锁”的神话,标志着中国AI企业在AI大模型技术路径上取得彻底突破。 不过,DeepSeek等AI大模型的突破,固然大幅推动AI产业的整体发展,但算力基础设施能否跟上,也将决定未…...
Spring Boot 与 MyBatis Plus 整合 KWDB 实现 JDBC 数据访问
引言 本文主要介绍如何在 IDEA 中搭建一个使用 Maven 管理的 Spring Boot 应用项目工程,并结合在本地搭建的 KWDB 数据库(版本为:2.0.3)来演示 Spring Boot 与 MyBatis Plus 的集成,以及对 KWDB 数据库的数据操作…...
VSCode+arm-none-eabi-gcc交叉编译+CMake构建+OpenOCD(基于STM32的标准库/HAL库)
前言:什么是CMake? Answer:简而言之,CMake是Make的maker。 一、CMake的安装 进入CMake官网的下载地址Get the Software,根据系统安装对应的Binary distributions。 或者在CMake——国内镜像获取二进制镜像安装包。 …...
MarsCode AI实战:利用DeepSeek 快速搭建你的口语学习搭子
资料来源:火山引擎-开发者社区 成品抢先看! 自从MarsCode AI Chat模型全新升级,接入 Deepseek-R1、Deepseek-V3和豆包大模型1.5 三大模型,越来越多朋友注意到了AI编程能给我们带来的无限可能,也开始跃跃欲试想要尝试从…...
导出的使用
一.导出的具体使用步骤 1.在web开发中,导出是很常见的一个功能,当我进行个人项目练习的时候,导出的时候无法控制列宽以及居中样式,后续发现导出插件无法进行修改,整个插件较为简便易懂的同时,对于EX的控制…...
【OCR】总结github上开源 OCR 工具:让文字识别更简单
前言 在数字化的时代,光学字符识别(OCR)技术成为了我们处理文档、图像文字信息的得力助手。它能够将图像中的文字信息转换为可编辑和可处理的文本数据,极大地提高了信息处理的效率。今天,我要给大家介绍一些优秀的开源…...
struts1+struts2项目兼容升级到了spring boot 2.7
原项目比较复杂,集成了各种框架(struts1 struts2 spring3等),趁工作之余练练手,学习一下springboot。大概花了一周时间才调通。 一、调整jar版本,寻找合适的版本。 第一步、首先原项目JDK6,要…...
Odoo 18 中的列表(list) 、表单(Form)、数据透视表、图表视图、看板视图、活动视图、日历视图等综合应用实例
Odoo 18 中的 视图应用实例 在 Odoo 中,视图是用户界面中表示业务对象的重要组成部分。无论您是扩展现有功能还是创建全新的功能,业务对象都至关重要。这些对象通过不同类型的视图向用户展示,而 Odoo 会根据 XML 描述动态生成这些视图。 列…...
单元测试mock
一、背景 现在有A类,B类,C类,A类依赖B类,依赖C类,如果想要测试A类中的某个方法的业务逻辑。A类依赖其他类,则把其他类给mock,然后A类需要真实对象。这样就可以测试A类中的方法。 举例:Ticket类需要调用Flight类和Pas…...
PDF文件转Markdown,基于开源项目marker
首先我们来问下deepseek 为啥要选marker呢 基于深度学习,一看就逼格拉满。搞科研必备,效果应该不会太差。跟其他的阿猫阿狗工具没法比。 看下官网 https://github.com/VikParuchuri/marker 一看头像是个印度佬,自吹——又快又好。…...
mysql中find_in_set()函数用法详解及增强函数
MySQL的 FIND_IN_SET()函数是一种特殊的函数,它主要用于搜索一个字符串在一个逗号分隔的字符串列表中的位置。 函数的基本语法 FIND_IN_SET(str, strlist) 其中,str是你想要查找的字符串,而 strlist是一个包含多个以逗号分隔的字符串的列表…...
深入理解 JavaScript/TypeScript 中的假值(Falsy Values)与逻辑判断 ✨
🕹️ 深入理解 JavaScript/TypeScript 中的假值(Falsy Values)与逻辑判断 在 JavaScript/TypeScript 开发中,if (!value) 是最常见的条件判断之一。它看似简单,却隐藏着语言的核心设计逻辑,也是许多开发者…...
批量合并 PPT 文件,支持合并成单个文件也支持按文件夹合并
合并多个 PPT 为一个 PPT 文档是我们经常会碰到的需求,合并后不仅更容易管理,在某些场景(比如批量打印)下也非常的有用,那当我们需要批量合并多个 PPT 文档地时候,我们有没有比较高效的方法呢?今…...
Java复习
在开篇前首先申明一下,本文虽不够系统,但复习够用,尤其是快速回忆( •̀ ω •́ )✧与提问。 主打一个速度。 本文将会从Java的基础语法、面向对象、API、字符串、集合、进阶...等六方面讲起。 一、Java的基础语法: 1、Java入门…...
keepalived+nginx+tomcat高可用
1.要求 角色主机名软件IP地址用户client192.168.72.90keepalivedvip192.168.72.100mastermasterkeepalived, nginx192.168.72.30backupbackupkeepalived, nginx192.168.72.32webtomcat1tomcat192.168.72.41webtomcat2tomcat192.168.72.42 1.搭建Tomcat 1.1下载jdk wget http…...
RK3568 Android11 sh366006驱动
sh366006.c /* 谁愿压抑心中怒愤冲动咒骂这虚与伪与假从没信要屈膝面对生命纵没有别人帮一生只靠我双手让我放声疯狂叫囔今天的他 呼风可改雨不可一世太嚣张 --《不可一世》Beyond */ #include <linux/module.h> #include <linux/init.h> #include <linux/fs.h…...
实现分布式锁需要考虑哪些问题?
🔒 什么是分布式锁? 分布式锁是在分布式系统中控制共享资源访问的机制,用于解决高并发场景下数据不一致、操作冲突等问题。核心目标是保证跨进程 / 跨节点的互斥性,常见实现方案包括:数据库锁、Redis 锁、ZooKeeper 锁…...
【UI设计】一些好用的免费图标素材网站
阿里巴巴矢量图标库https://www.iconfont.cn/国内最大的矢量图标库之一,拥有 800 万 图标资源。特色功能包括团队协作、多端适配、定制化编辑等,适合企业级项目、电商设计、中文产品开发等场景。IconParkhttps://iconpark.oceanengine.com/home字节跳动…...
mysql-大批量插入数据的三种方式和使用场景
1.批量插入三种方式 INSERT INTO … SELECTINSERT INTO … VALUES (…)LOAD DATA INFILE ‘/path/to/datafile.csv’ INTO TABLE table_name 2.批量插入 2.1 INSERT INTO … SELECT 用途:从另一个表中选择数据并插入到目标表中。 语法示例: INSERT …...
创建自己的github.io
1、创建GitHub账号 GitHub地址:https://github.com/ 点击Sign up创建账号 如果已创建,点击Sign in登录 2、创建仓库 假设Owner为username,则Repository name为username.github.io说明: 1、Owner为用户名 2、Repository name为仓…...