181 lines
5.4 KiB
Markdown
181 lines
5.4 KiB
Markdown
|
|
# Client-Native (重构版) - 现代化项目结构
|
|||
|
|
|
|||
|
|
## 项目说明
|
|||
|
|
|
|||
|
|
这是 Client-Native 项目的重构版本,采用现代 C++ 项目管理标准,将原本 462 行的单一 `main.cpp` 文件重构为模块化的多文件结构。
|
|||
|
|
|
|||
|
|
## 项目结构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Client-Native/
|
|||
|
|
├── main.cpp # 主程序入口(122行)
|
|||
|
|
├── pch.h / pch.cpp # 预编译头文件
|
|||
|
|
├── CertificateConfig.h/.cpp # 证书配置模块
|
|||
|
|
├── CertificateManager.h/.cpp # 证书管理模块
|
|||
|
|
├── SSLClientConnection.h/.cpp # SSL客户端连接模块
|
|||
|
|
├── main.cpp.backup # 原始文件备份
|
|||
|
|
└── README_REFACTOR.md # 本文件
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 模块说明
|
|||
|
|
|
|||
|
|
### 1. **CertificateConfig** - 证书配置
|
|||
|
|
- **职责**: 存储和提供SSL证书数据
|
|||
|
|
- **文件**: `CertificateConfig.h`, `CertificateConfig.cpp`
|
|||
|
|
- **特点**:
|
|||
|
|
- 静态方法访问证书数据
|
|||
|
|
- 包含客户端证书、私钥、CA证书和密码
|
|||
|
|
- 单一职责:证书数据管理
|
|||
|
|
|
|||
|
|
### 2. **CertificateManager** - 证书管理器
|
|||
|
|
- **职责**: 加载和解析证书
|
|||
|
|
- **文件**: `CertificateManager.h`, `CertificateManager.cpp`
|
|||
|
|
- **功能**:
|
|||
|
|
- 从内存加载 X509 证书
|
|||
|
|
- 从内存加载加密私钥
|
|||
|
|
- 打印 OpenSSL 错误信息
|
|||
|
|
- **特点**: 无状态工具类,可复用
|
|||
|
|
|
|||
|
|
### 3. **SSLClientConnection** - SSL客户端连接
|
|||
|
|
- **职责**: 封装完整的SSL客户端通信逻辑
|
|||
|
|
- **文件**: `SSLClientConnection.h`, `SSLClientConnection.cpp`
|
|||
|
|
- **功能**:
|
|||
|
|
- 初始化 SSL 环境
|
|||
|
|
- 建立到服务器的 SSL 连接
|
|||
|
|
- 发送和接收加密数据
|
|||
|
|
- 资源管理(RAII模式)
|
|||
|
|
- **特点**:
|
|||
|
|
- 使用构造函数/析构函数管理资源
|
|||
|
|
- 禁用拷贝构造和赋值操作
|
|||
|
|
- 提供清晰的公共接口
|
|||
|
|
|
|||
|
|
### 4. **main.cpp** - 应用程序入口
|
|||
|
|
- **职责**: 用户交互和流程控制
|
|||
|
|
- **行数**: 从 462 行减少到 122 行
|
|||
|
|
- **功能**:
|
|||
|
|
- 控制台初始化
|
|||
|
|
- 创建和管理 SSLClientConnection 对象
|
|||
|
|
- 用户命令处理
|
|||
|
|
- 主事件循环
|
|||
|
|
|
|||
|
|
## 改进之处
|
|||
|
|
|
|||
|
|
### 🎯 单一职责原则(SRP)
|
|||
|
|
- 每个类只负责一个功能领域
|
|||
|
|
- 易于理解和维护
|
|||
|
|
|
|||
|
|
### 🔒 封装性
|
|||
|
|
- 私有成员和公共接口清晰分离
|
|||
|
|
- 隐藏实现细节
|
|||
|
|
|
|||
|
|
### ♻️ 资源管理(RAII)
|
|||
|
|
- SSLClientConnection 自动管理 SSL 资源
|
|||
|
|
- 析构函数确保资源正确释放
|
|||
|
|
- 无需手动调用 Cleanup
|
|||
|
|
|
|||
|
|
### 📦 模块化
|
|||
|
|
- 代码按功能分组到不同文件
|
|||
|
|
- 便于单元测试
|
|||
|
|
- 易于复用(例如 CertificateManager 可用于其他项目)
|
|||
|
|
|
|||
|
|
### 🚫 消除全局变量
|
|||
|
|
- 原版使用全局 `g_ssl_ctx`, `g_ssl`, `g_socket`
|
|||
|
|
- 重构版所有状态封装在对象内部
|
|||
|
|
|
|||
|
|
### 📋 命名规范
|
|||
|
|
- 类名使用 PascalCase
|
|||
|
|
- 函数名使用 PascalCase
|
|||
|
|
- 私有成员使用 `m_` 前缀
|
|||
|
|
|
|||
|
|
## 对比统计
|
|||
|
|
|
|||
|
|
| 指标 | 原版 | 重构版 | 改进 |
|
|||
|
|
|------|------|--------|------|
|
|||
|
|
| main.cpp 行数 | 462 | 122 | -73.6% |
|
|||
|
|
| 源文件数量 | 1 | 4 | +300% |
|
|||
|
|
| 全局变量 | 3 | 0 | -100% |
|
|||
|
|
| 类数量 | 0 | 3 | +3 |
|
|||
|
|
| 代码复用性 | 低 | 高 | ⬆️ |
|
|||
|
|
| 可测试性 | 低 | 高 | ⬆️ |
|
|||
|
|
|
|||
|
|
## 编译和运行
|
|||
|
|
|
|||
|
|
项目仍然使用相同的编译配置:
|
|||
|
|
- Visual Studio 2022
|
|||
|
|
- 平台工具集: v143
|
|||
|
|
- OpenSSL 14x (x64/x86)
|
|||
|
|
- 静态链接运行时库 (MTd/MT)
|
|||
|
|
|
|||
|
|
### 编译步骤
|
|||
|
|
1. 打开 `TestEcho-SSL-Console.sln`
|
|||
|
|
2. 选择 `Client-Native` 项目
|
|||
|
|
3. 选择配置(Debug/Release)和平台(x64/x86)
|
|||
|
|
4. 点击 "生成"
|
|||
|
|
|
|||
|
|
### 运行
|
|||
|
|
运行方式与原版完全相同:
|
|||
|
|
```bash
|
|||
|
|
.\Client-Native.exe
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 依赖关系
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
main.cpp
|
|||
|
|
├─> SSLClientConnection
|
|||
|
|
│ ├─> CertificateManager
|
|||
|
|
│ └─> CertificateConfig
|
|||
|
|
└─> CertificateConfig
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 功能保持一致
|
|||
|
|
|
|||
|
|
重构版本保持与原版完全相同的功能:
|
|||
|
|
- ✅ SSL_VM_PEER 双向认证
|
|||
|
|
- ✅ 使用内存中的证书(无需文件)
|
|||
|
|
- ✅ 连接到 127.0.0.1:5555
|
|||
|
|
- ✅ 发送 "hello" 消息
|
|||
|
|
- ✅ 接收并显示服务器响应
|
|||
|
|
- ✅ UTF-8 中文支持
|
|||
|
|
- ✅ 非阻塞数据接收
|
|||
|
|
- ✅ 交互式命令菜单
|
|||
|
|
|
|||
|
|
## 未来扩展方向
|
|||
|
|
|
|||
|
|
这种模块化结构便于以下扩展:
|
|||
|
|
1. **配置文件支持**: 将 CertificateConfig 改为从文件读取
|
|||
|
|
2. **日志系统**: 添加 Logger 类统一管理输出
|
|||
|
|
3. **异步 IO**: 使用 `std::async` 或线程池处理网络 IO
|
|||
|
|
4. **异常处理**: 使用异常代替返回值错误处理
|
|||
|
|
5. **智能指针**: 使用 `std::unique_ptr` 管理 SSL 对象
|
|||
|
|
6. **配置类**: 抽象服务器地址、端口为配置对象
|
|||
|
|
|
|||
|
|
## 学习要点
|
|||
|
|
|
|||
|
|
### 对比学习建议
|
|||
|
|
1. **原始版本** (`main.cpp.backup`): 了解底层 OpenSSL + Winsock API
|
|||
|
|
2. **重构版本**: 学习现代 C++ 项目组织和设计模式
|
|||
|
|
|
|||
|
|
### 设计模式
|
|||
|
|
- **RAII** (Resource Acquisition Is Initialization): SSLClientConnection
|
|||
|
|
- **Static Factory**: CertificateConfig 静态方法
|
|||
|
|
- **Manager Pattern**: CertificateManager
|
|||
|
|
|
|||
|
|
### C++ 最佳实践
|
|||
|
|
- 禁用不需要的特殊成员函数(拷贝构造/赋值)
|
|||
|
|
- 使用 `const` 限定常量方法
|
|||
|
|
- 头文件保护(`#pragma once`)
|
|||
|
|
- 命名空间管理(`namespace SSLClient`)
|
|||
|
|
|
|||
|
|
## 总结
|
|||
|
|
|
|||
|
|
这次重构展示了如何将"一个文件实现所有功能"的代码转变为遵循现代 C++ 最佳实践的模块化项目。虽然行数增加了(因为增加了头文件和模块边界),但代码的**可读性、可维护性、可测试性**都得到了显著提升。
|
|||
|
|
|
|||
|
|
对于学习者来说,两个版本都有价值:
|
|||
|
|
- **原版**: 快速理解完整流程
|
|||
|
|
- **重构版**: 学习工程化实践
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
*重构日期: 2025*
|
|||
|
|
*原始项目: TestEcho-SSL-Console/Client-Native*
|