网络架构、及HTTP协议
在计算机网络和软件开发中,CS架构(客户端-服务器架构)和BS架构(浏览器-服务器架构)是两种主要的应用程序架构。CS架构是一种典型的两层结构,包括客户端和服务器两个部分。在这种架构中,客户端和服务器通过网络进行通信,每部分都有明确的职责客户端:安装在用户设备上,负责界面交互、部分业务逻辑处理。服务器:集中管理数据、核心业务逻辑,响应客户端的请求。典型示例桌面版 QQ / 微信(客户端 ↔ 腾讯服
文章目录
网络通信架构
1.概述
在计算机网络和软件开发中,CS架构(客户端-服务器架构)和BS架构
(浏览器-服务器架构)是两种主要的应用程序架构。
2.CS架构
客户端-服务器写法,可见网络协议,及在LInux和QT中的运用文章
1.概述
CS架构是一种典型的两层结构,包括客户端和服务器两个部分。在这种架构中,客户端和服务器通过网络进行通信,每部分都有明确的职责
客户端:安装在用户设备上,负责界面交互、部分业务逻辑处理。
服务器:集中管理数据、核心业务逻辑,响应客户端的请求。
典型示例
桌面版 QQ / 微信(客户端 ↔ 腾讯服务器)
大型游戏(《英雄联盟》客户端 ↔ 游戏服务器)
2.通信特点
- 自定义通信协议(TCP/UDP ,或使用 RPC、HTTP)。
- 客户端直接与服务器长连接或短连接,常保持会话状态(如登录态)。
- 服务器需要为每个客户端维护一定的状态信息。
3.优点
- 性能好:客户端分担计算,服务器压力较小,可充分发挥本地硬件能力。
- 体验丰富:可利用操作系统所有图形、文件、外设能力。
- 网络依赖低:离线时也能运行部分功能,数据暂存本地。
- 安全性可控:可自定义加密和认证机制,不依赖浏览器沙箱。
4.缺点
- 部署维护成本高:每台客户端需单独安装、升级(需推送更新包)。
- 跨平台困难:需要为 Windows、macOS、Linux、iOS、Android 分别开发。
- 版本碎片化:用户可能使用不同版本客户端,兼容性测试复杂。
3.BS架构
BS架构是一种基于Web的三层或多层架构,主要通过Web浏览器作为客户端访问服务器上的应用程序
1.概述
浏览器(客户端)
使用标准Web浏览器(如Chrome、Firefox等)作为客户端。无需安装额外的软件,使用HTML、CSS和JavaScript显示内容。
服务器
和CS架构中的服务器类似,处理业务逻辑和数据存储。通过Web服务(如HTTP服务器)提供页面和数据。
典型示例
绝大多数网站(淘宝、百度、Gmail)
2.通信特点
- 标准协议 HTTP/HTTPS,资源型通信(请求 → 响应)。
- 无状态(每个请求独立)。
- 浏览器负责渲染 HTML/CSS/JS,服务器只返回数据(纯 API 模式,如 JSON)。
3.优点
-
零部署、易维护:只需更新服务器代码,所有用户立即使用最新版本。
-
跨平台:任何有浏览器的设备(PC、手机、平板)均可访问。
-
防火墙友好:使用 80/443 端口,网络穿透容易。
-
开发技术统一:前端(HTML/CSS/JS)+ 后端(任意语言)分工清晰。
4.缺点
- 严重依赖网络:离线几乎不可用。
- 性能瓶颈:大量逻辑在服务器端,高并发下压力大;页面渲染依赖网络往返。
- 体验受限:复杂交互受浏览器能力限制,实时性(如游戏、视频编辑)不如 CS。
- 安全性风险面广:需应对 Web的 特有攻击。
4.CS和BS对比
CS 与 BS 的对比总结表
| 维度 | CS 架构 | BS 架构 |
|---|---|---|
| 客户端 | 专用客户端程序 | 通用浏览器 |
| 部署更新 | 每台客户端单独安装/升级 | 只需更新服务器 |
| 跨平台 | 需为不同 OS 单独开发 | 一次开发,随处运行 |
| 网络依赖 | 可离线运行部分功能 | 强依赖网络(在线) |
| 性能 | 高,可充分利用本地资源 | 受限于网络和服务器 |
| 用户体验 | 丰富,可调用系统 API | 受浏览器沙箱限制 |
| 开发成本 | 高(双端 + 维护多版本) | 低(前后端分离,标准协议) |
| 典型协议 | 自定义 TCP/UDP、RPC、HTTP | HTTP/HTTPS |
| 安全性 | 数据经常在客户端和服务器之间传输,可能需要更复杂的安全措施 | 敏感数据主要存储在服务器端 |
HTTP
1.概述
HTTP(HyperText Transfer Protocol,超文本传输协议) 是 Web 的基石,用于客户端(如浏览器)与服务器之间传输超文本(HTML、图片、JSON 等)
2.请求‑响应模型
请求包含资源地址,响应包含资源内容或状态信息
- 客户端 → 请求 → 服务器
- 服务器 → 响应 → 客户端
3.常用HTTP 方法
| 方法 | 作用 |
|---|---|
| GET | 请求资源 |
| POST | 提交数据 |
| PUT | 上传/替换资源 |
| DELETE | 删除资源 |
| HEAD | 仅获取资源的元信息 |
4.常见状态码
| 状态码 | 含义 |
|---|---|
| 200 | 成功 |
| 301 | 永久重定向 |
| 404 | 资源未找到 |
| 500 | 服务器内部错误 |
4. URL(统一资源定位符)
资源地址,格式如 http://example.com/path
包含协议、域名、路径等
例如


5. HTTP 头(Headers)
HTTP请求和响应包含头部信息,这些信息包括元数据,如内容类型、内容长度、服务器信息、客户端信息等。
6. 无状态协议
服务器默认不保留任何请求之间的状态,但可通过 Cookies 等机制模拟状态
7. HTTPS(安全版)
HTTP + TLS/SSL 加密层,提供数据加密、身份认证、完整性保护
什么时候HTTP? 什么时候用HTTPS?一般需要加密的场景用https
如果一个页面既不涉及用户身份,也不包含任何敏感数据,只是纯粹的公开信息(比如新闻文章、天气查询结果),并且不需要防止别人篡改,那么理论上可以用 HTTP。但在今天,出于安全习惯和浏览器提示(比如“不安全”警告),很多公开站点也已经全面启用 HTTPS。
8. RESTful API
RESTful是一种使用HTTP协议的Web服务设计风格,它利用HTTP的方法来实现API的不同操作。在RESTful架构中,每个URL代表一个资源,并使用 HTTP 方法(GET/POST/PUT/DELETE)操作资源
9. Session 与 Cookies
Cookie:客户端存储的小段数据,随请求发送
Session:服务器端存储的用户状态数据
两者配合解决 HTTP 无状态问题,维持用户连贯体验(如登录状态)
JSON数据
1.概述
一种轻量级的文本数据交换格式,语言无关,但基于 JavaScript 对象语法,在客户端与服务器之间传输结构化数据
现代 Web API(尤其是 RESTful API)几乎都以 JSON 为主要数据格式
2.基本语法
数据类型
| 类型 | 示例 |
|---|---|
| 字符串 | “hello” |
| 数字 | 123, 3.14 |
| 布尔值 | true, false |
| 空值 | null |
| 数组 | [1, 2, 3] |
| 对象 | {“name”: “John”, “age”: 30} |
JSON数据示例键名必须用双引号,字符串必须双引号
{
"userId": 1001,
"name": "张三",//name是键名,"张三"是键值
"isActive": true,
"scores": [98, 87, 92],
"address": {
"city": "北京",
"zip": "100000"
},
"avatar": null
}
3.QT中
1.概述
Qt 提供了一套完整的 JSON 处理类,均在 QtCore 模块中(无需额外配置,Qt += core 即可)
核心四类分工明确:
| 类 | 用途 |
|---|---|
| QJsonValue | 封装 JSON 中的任意值(对象、数组、字符串、数字、布尔、null) |
| QJsonObject | 表示 JSON 对象,支持键值对查找、插入、删除,size()、insert()、remove() 等操作 |
| QJsonArray | 表示 JSON 数组,支持索引访问(下标索引)、追加元素(append) |
| QJsonDocument | 完整 JSON 文档的封装容器,负责序列化与反序列化,核心方法为 fromJson() 和 toJson() |
2解析 JSON 字符串 → Qt 对象
数据通常是 UTF-8 编码的 QByteArray
QString jsonString = R"({
"name": "张三",
"age": 30,
"scores": [95, 87, 92]
})";
这里 R"( ... )" 中的{ 到 }之间的所有字符(包括换行、引号、反斜杠等)都被原封不动地当作字符串内容,不需要再写 \n 或 \" 来转义。
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
// 原始 JSON 字符串
QString jsonString = R"({
"name": "张三",
"age": 30,
"scores": [95, 87, 92]
})";
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(jsonString.toUtf8(), &error);
if (error.error != QJsonParseError::NoError) {
qDebug() << "JSON 解析失败:" << error.errorString();
return;
}
QJsonObject root = doc.object();
QString name = root["name"].toString(); // "张三"
int age = root["age"].toInt(); // 30
QJsonArray scores = root["scores"].toArray(); // [95, 87, 92]
3.Qt 对象 → JSON 字符串
QJsonObject root;
root["name"] = "李四";
root["age"] = 25;
root["isActive"] = true;
QJsonDocument doc(root);
QByteArray jsonData = doc.toJson(QJsonDocument::Compact);
QT中的HTTP编程
添加网络权限
发送HTTP请求

获得响应后,会发出QNetworkAccessManager::finished信号
void QNetworkAccessManager::finished(QNetworkReply *reply)

为这个信号建立槽函数
处理数据
利用此函数进行HTTP状态码的判断,判断是否成功

QVariant QNetworkReply::attribute(QNetworkRequest::Attribute code) const

解析JSON数据

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)