文章目录
软件开发网络架构
BS架构/CS架构
在计算机网络和软件开发中,CS架构(Client-Server Architecture,客户端-服务器架构)和BS架构(Browser-Server Architecture,浏览器-服务器架构)是两种主要的应用程序架构。
CS架构是一种典型的两层结构,包括客户端和服务器两个部分。在这种架构中,客户端和服务器通过网络进行通信,每部分都有明确的职责。
- 客户端:
-
用户界面通常在客户端呈现。
-
可以是桌面应用程序、移动应用或专用软件。
-
负责向服务器发送请求,接收和处理服务器响应。
- 服务器:
-
管理数据和业务逻辑。
-
处理来自客户端的请求,并发送回响应。
-
通常承载在远程系统上,如数据库服务器、应用服务器等。
- 特点:
-
需要为每种操作系统或平台单独开发客户端。
-
高效的数据处理和响应能力。
-
在客户端设备上占用资源(如内存和处理能力)。
BS架构(浏览器-服务器架构)
BS架构是一种基于Web的层或多层架构,主要通过Web浏览器作为客户端访问服务器上的应用程序。
- 浏览器(客户端):
-
使用标准Web浏览器(如Chrome、Firefox等)作为客户端。
-
无需安装额外的软件,使用HTML、CSS和JavaScript显示内容。
- 服务器:
-
和CS架构中的服务器类似,处理业务逻辑和数据存储。
-
通过Web服务(如HTTP服务器)提供页面和数据。
- 特点:
-
跨平台兼容性强,可以在任何支持Web浏览器的设备上运行。
-
客户端无需安装专用软件,容易维护和更新。
-
可能依赖网络性能,因为所有操作都在服务器上进行。
对比
-
部署和维护:BS架构易于部署和维护,而CS架构通常需要在每个客户端单独安装和更新。
-
性能:CS架构可以更有效地利用客户端的计算资源,适合高性能要求的应用。BS架构依赖于服务器的性能和网络延迟。
-
安全性:CS架构中,数据经常在客户端和服务器之间传输,可能需要更复杂的安全措施。BS架构中,敏感数据主要存储在服务器端。
-
用户体验:CS架构通常能提供更丰富的用户界面和交互功能。BS架构的用户体验受限于Web技术的能力。
在实际应用中,选择哪种架构取决于具体的业务需求、目标用户群、性能要求以及开发和维护的成本。
HTTP基本概念
HTTP(超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。它是万维网(WWW)的数据通信的基础。了解HTTP的基本概念对于理解现代网络通信至关重要。以下是HTTP的一些核心概念:
1. 请求和响应
HTTP是一个基于请求-响应模式的协议。客户端(通常是Web**浏览器)向服务器发送一个HTTP请求,然后服务器返回一个HTTP响应。**请求包含请求的资源(如网页),而响应包含请求的资源的内容。
- HTTP方法
HTTP定义了一系列的方法来表明对资源的不同操作,最常用的包括:
-
GET: 用于请求资源。
-
POST: 用于提交数据给服务器(例如,表单数据)。
-
PUT: 用于上传文件或内容。
-
DELETE: 用于请求删除资源。
-
HEAD: 用于获取资源的元信息,而不是资源本身。
3. 状态码
服务器对请求的响应中包含一个状态码,它表示请求的成功或失败,以及失败的原因。常见的状态码包括:
-
200 OK: 请求成功。
-
404 Not Found: 请求的资源未找到。
-
500 Internal Server Error: 服务器内部错误。
-
301 Moved Permanently: 请求的资源已永久移动到新位置。
4. URL**(统一资源定位符)**
URL是Web上资源的地址。它指定了资源的位置以及用于访问资源的协议(例如,http://)。
- HTTP头
HTTP请求和响应包含头部信息,这些信息包括元数据,如内容类型、内容长度、服务器信息、客户端信息等。例如, Content-Type 头部指示响应中的媒体类型(如text/html,application/json)。
6. 无状态协议
HTTP是一个无状态协议,这意味着服务器不会保留任何请求的数据(状态)。然而,通过使用如Cookies这样的机制,可以在多个请求之间维持状态。
7. **安全性(**HTTPS)
HTTPS是HTTP的安全版本,它在HTTP和TCP层之间增加了一个加密层(通常是SSL/TLS)。这提供了数据传输的加密和更好的安全性。
8. RESTful API
RESTful是一种使用HTTP协议的Web服务设计风格,它利用HTTP的方法来实现API的不同操作。在
RESTful架构中,每个URL代表一个资源,并使用HTTP的方法(如GET, POST)来处理这些资源。
9. Session和Cookies
由于HTTP本身是无状态的,Cookies和会话(Session)被用来在多个请求之间存储用户数据,从而为用户提供连贯的体验。
这些概念构成了HTTP的基础,是理解和使用HTTP协议的关键。每个概念都有它的具体细节和使用场景,了解这些有助于更好地在网络应用开发中应用HTTP。
QT的HTTP编程
Qt中的HTTP编程主要涉及使用Qt的网络模块来进行HTTP请求和处理HTTP响应。Qt提供了一系列类来处理网络通信,其中最常用的类是 QNetworkAccessManager
、 QNetworkRequest
、QNetworkReply
以及相关的支持类。
以下是一个基本的HTTP编程示例,展示了如何使用Qt发送一个简单的HTTP GET请求并处理响应:
步骤 1: 包含必要的头文件
c++
#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QObject>
#include <QDebug>
步骤 2: 发送HTTP请求
创建一个 QNetworkAccessManager
对象,并使用它发送HTTP请求。 QNetworkAccessManager
对象会异步地处理请求,并返回一个 QNetworkReply 对象
c++
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QNetworkAccessManager manager;
QNetworkRequest request(QUrl("http://example.com"));
QNetworkReply *reply = manager.get(request);
QObject::connect(reply, &QNetworkReply::finished, [&]() {
if (reply->error()) {
qDebug() << "Error:" << reply->errorString();
return;
}
QString response = reply->readAll();
qDebug() << "Response:" << response;
});
return a.exec();
}
在这个例子中,我们使用 QNetworkAccessManager 的 get 方法发送了一个HTTP GET请求到"http://example.com"。然后,我们连接了 QNetworkReply 对象的 finished 信号到一个lambda函数,该函数在收到HTTP响应时被调用。
注意事项
-
异步处理: QNetworkAccessManager 的请求是异步的。这意味着 get 方法会立即返回,而HTTP响应将在稍后通过信号处理。
-
错误处理: 应该检查 QNetworkReply 对象是否有错误,并相应地处理。
-
内存管理: QNetworkReply 对象需要被正确地管理,以避免内存泄漏。通常情况下,使用QObject::deleteLater 来安排删除它是一个好方法。
JSON数据
概述
==JSON(JavaScript Object Notation)==是一种轻量级的数据交换格式。它易于人阅读和编写,同时也易于机器解析和生成。JSON是基于JavaScript的一个子集,尽管它是独立于语言的,且有多种语言支持。JSON常用于网络应用程序中的数据传输,尤其是在Web应用程序中与后端服务器通信。
使用JSON的原因总结如下:
原因 | 描述 |
---|---|
易于阅读和编写 | JSON的结构简单、清晰,对人类来说易于阅读和编写。 |
轻量级数据格式 | 相较于XML等标记语言,JSON更轻量,使用更少的符号,数据体积更小。 |
易于解析和生成 | 大多数编程语言都提供了解析和生成JSON的内置支持或库。 |
跨语言支持 | JSON是独立于语言的,被广泛支持和使用在多种编程语言中。 |
BS/CS开发过程中,会使用不同的编程语言,JSON作为数据传输的标准化格式,方便程序员协议约定和数据处理,以下是不同编程语言处理JSON的方案
语言/平台 | JSON处理库/接口 | 特点/描述 |
---|---|---|
C | Jansson | 提供JSON的编码、解码和处理功能 |
C++ | nlohmann/json | 现代C++(从C++11开始)的JSON库,易于使用 |
Java | Jackson | 强大的JSON处理库,支持JSON的序列化和反序列化 |
Python | json | Python标准库中的JSON处理模块 |
Qt | QJsonDocument | Qt框架中用于JSON处理的类 |
Android | org.json | Android SDK自带的JSON处理类,提供基础JSON操作功能 |
QT生成JSON数据
在Qt中生成JSON数据并将其保存到文件的一个基本示例涉及使用 QJsonDocument
、 QJsonObject
和QJsonArray
类。以下是创建一个简单JSON对象并将其保存到文件的示例代码。
c++
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QFile>
#include <QDebug>
void createJsonFile() {
// 创建一个JSON对象 键值对
QJsonObject jsonObj;
jsonObj["name"] = "John Doe";
jsonObj["age"] = 30;
jsonObj["email"] = "[email protected]";
// 创建一个JSON数组
QJsonArray jsonArr;
jsonArr.append("C++");
jsonArr.append("Python");
jsonArr.append("JavaScript");
jsonArr.append(123);
// 将数组添加到JSON对象
jsonObj["languages"] = jsonArr;
// 将JSON对象转换为JSON文档
QJsonDocument jsonDoc(jsonObj);
// 将JSON文档转换为字符串(也可以是压缩格式)
QByteArray jsonData = jsonDoc.toJson(QJsonDocument::Indented);
// 将JSON数据写入文件
QFile file("output.json");
if (!file.open(QIODevice::WriteOnly)) {
qDebug() << "Failed to open file for writing";
return;
}
file.write(jsonData);
file.close();
qDebug() << "JSON data saved to output.json";
}
int main() {
createJsonFile();
return 0;
}
说明
- 创建JSON对象:使用 QJsonObject 来构建JSON对象,并使用键值对填充数据。
- 创建JSON数组**:使用 QJsonArray 来创建一个数组,并添加元素。
- 组合JSON结构:将JSON数组添加到JSON对象中。
- 生成JSON文档:通过 QJsonDocument 来处理JSON数据,可以选择格式化(缩进)或压缩形式。
- 保存到文件:创建 QFile 对象,打开文件,写入JSON数据,并关闭文件。
这个例子展示了Qt中处理JSON的基础流程,包括创建、填充数据、转换为字符串,以及写入文件。您可以根据需要调整这个流程来适应更复杂的JSON结构或数据。
c++
#include "widget.h"
#include "ui_widget.h"
#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QJsonObject rootObj;
rootObj["cityid"] = "1010100";
rootObj["date"] = "2024-01-23";
rootObj["weather"] = "雨夹雪";
rootObj["tmp"] = 3;
QJsonArray jsonArray;
jsonArray.append("data1");
jsonArray.append("data2");
jsonArray.append("data3");
jsonArray.append(100);
rootObj["testArry"] = jsonArray;
QJsonDocument jsonDoc(rootObj);
QByteArray jsonArry = jsonDoc.toJson();
QFile file("D:/QT/test.json");
file.open(QIODevice::WriteOnly);
file.write(jsonArry);
file.close();
}
Widget::~Widget()
{
delete ui;
}
在JSON中,数组可以包含多种类型的元素,包括对象。当您在Qt中处理JSON数组,其中的元素是对象时,您可以使用 QJsonArray 和 QJsonObject 来创建和处理这些数据结构。以下是一个示例,展示了如何创建一个包含多个对象的JSON数组,并将该数组添加到一个JSON对象中。
示例:
c++
#include "widget.h"
#include "ui_widget.h"
#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QJsonObject rootObj;
rootObj["cityid"] = "1010100";
rootObj["date"] = "2024-01-23";
rootObj["weather"] = "雨夹雪";
rootObj["tmp"] = 3;
//Json数组
QJsonArray jsonArray;
jsonArray.append("data1");
jsonArray.append("data2");
jsonArray.append("data3");
jsonArray.append(100);
rootObj["testArry"] = jsonArray;
QJsonObject alarmObj;
alarmObj["alamType"] = "雪灾";
alarmObj["alamLeve"] = "黄色";
alarmObj["alamTitle"] = "福州市警告老陈多穿点衣服";
rootObj["alam"] = alarmObj;
QJsonObject day0;
day0["day"] = "星期一";
day0["wea"] = "晴";
day0["tem"] = 5.7;
QJsonObject day1;
day1["day"] = "星期二";
day1["wea"] = "晴";
day1["tem"] = 7;
QJsonObject day2;
day2["day"] = "星期三";
day2["wea"] = "多云";
day2["tem"] = 17;
QJsonArray dayArray;
dayArray.append(day0);
dayArray.append(day1);
dayArray.append(day2);
rootObj["days"] = dayArray;
//通过QJsonDocument把JSON数据转换成QByteArray
QJsonDocument jsonDoc(rootObj);
QByteArray jsonArry = jsonDoc.toJson();
QFile file("D:/QT/test.json");
file.open(QIODevice::WriteOnly);
file.write(jsonArry);
file.close();
}
Widget::~Widget()
{
delete ui;
}
QT解析JSON数据
在Qt中解析JSON数据通常涉及到使用 QJsonDocument
、 QJsonObject
和 QJsonArray
类。这些类提供了处理JSON数据的必要工具,使您能够从JSON字符串中提取信息、遍历JSON对象或数组,并访问具体的数据项。以下是一个基本的示例,展示了如何在Qt中解析JSON字符串。
示例:解析JSON字符串
json
{
"name": "John Doe",
"age": 30,
"email": "[email protected]",
"skills": ["C++", "Python", "JavaScript"]
}
以下是如何在Qt中解析这个JSON字符串的步骤:
c++
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>
void parseJson() {
// JSON字符串
/*
R 是用于定义原始字符串字面量(Raw String Literal)的标记。
在C++中,原始字符串字面量是一种方便的语法,
用于创建包含多行文本和特殊字符的字符串,而无需转义。
R"("chenlichen")"
*/
QString testStr = "chenli\"c";
QString jsonString = R"(
{
"name": "John Doe",
"age": 30,
"email": "[email protected]",
"skills": ["C++", "Python", "JavaScript"]
}
)";
/*jsonString = "{\n"
" \"name\": \"John Doe\",\n"
" \"age\": 30\n"
"}";
*/
// 将JSON字符串转换为QJsonDocument
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8());
// 检查JSON文档是否包含一个对象
if (!jsonDoc.isNull() && jsonDoc.isObject()) {
// 获取JSON对象
QJsonObject jsonObj = jsonDoc.object();
// 访问对象的键值
QString name = jsonObj["name"].toString();
int age = jsonObj["age"].toInt();
QString email = jsonObj["email"].toString();
qDebug() << "Name:" << name;
qDebug() << "Age:" << age;
qDebug() << "Email:" << email;
// 处理JSON数组
if (jsonObj.contains("skills") && jsonObj["skills"].isArray()) {
QJsonArray skillsArray = jsonObj["skills"].toArray();
for (const QJsonValue &value : skillsArray) {
qDebug() << "Skill:" << value.toString();
}
}
} else {
qDebug() << "Invalid JSON...";
}
}
int main() {
parseJson();
return 0;
}