网络通信架构

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数据
在这里插入图片描述

在这里插入图片描述

Logo

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

更多推荐