备份-基础ssl通信
This commit is contained in:
277
Client-Native/重构总结.md
Normal file
277
Client-Native/重构总结.md
Normal file
@@ -0,0 +1,277 @@
|
||||
# Client-Native 项目重构完成 ✅
|
||||
|
||||
## 重构概览
|
||||
|
||||
已成功将 **Client-Native** 项目从单一的 462 行 `main.cpp` 重构为现代化的模块化结构。
|
||||
|
||||
## 新项目结构
|
||||
|
||||
```
|
||||
Client-Native/
|
||||
├── 📄 main.cpp (122行) # 主程序入口 [-73.6%]
|
||||
├── 📦 CertificateConfig.h/cpp # 证书配置模块
|
||||
├── 📦 CertificateManager.h/cpp # 证书管理模块
|
||||
├── 📦 SSLClientConnection.h/cpp # SSL客户端连接模块
|
||||
├── 🔧 pch.h/pch.cpp # 预编译头
|
||||
├── 🗂️ Client-Native.vcxproj # 项目文件(已更新)
|
||||
├── 💾 main.cpp.backup # 原始文件备份
|
||||
├── 📖 README_REFACTOR.md # 重构说明文档
|
||||
└── 📘 README.md # 原始项目文档
|
||||
```
|
||||
|
||||
## 核心改进
|
||||
|
||||
### 1. 模块化设计
|
||||
- **CertificateConfig**: 证书数据存储(静态配置)
|
||||
- **CertificateManager**: 证书加载和解析工具
|
||||
- **SSLClientConnection**: 完整SSL连接封装(RAII)
|
||||
- **main.cpp**: 简洁的应用逻辑
|
||||
|
||||
### 2. 面向对象
|
||||
```cpp
|
||||
// 原版:全局变量 + 函数
|
||||
SSL_CTX* g_ssl_ctx;
|
||||
SSL* g_ssl;
|
||||
SOCKET g_socket;
|
||||
|
||||
// 重构版:封装在类中
|
||||
class SSLClientConnection {
|
||||
private:
|
||||
SSL_CTX* m_sslContext;
|
||||
SSL* m_ssl;
|
||||
SOCKET m_socket;
|
||||
// ...
|
||||
};
|
||||
```
|
||||
|
||||
### 3. RAII资源管理
|
||||
```cpp
|
||||
{
|
||||
SSLClientConnection client; // 构造函数初始化
|
||||
client.Initialize(...);
|
||||
client.Connect(...);
|
||||
// ...
|
||||
} // 析构函数自动清理资源 - 无需手动Cleanup()
|
||||
```
|
||||
|
||||
### 4. 单一职责原则
|
||||
每个模块只负责一件事:
|
||||
- 📋 CertificateConfig → 提供证书
|
||||
- 🔐 CertificateManager → 加载证书
|
||||
- 🌐 SSLClientConnection → SSL通信
|
||||
- 🎮 main → 用户交互
|
||||
|
||||
## 代码对比
|
||||
|
||||
| 特性 | 原版 | 重构版 | 改进 |
|
||||
|------|------|--------|------|
|
||||
| main.cpp行数 | 462 | 122 | **-73.6%** |
|
||||
| 全局变量 | 3个 | 0个 | **消除** |
|
||||
| 类/结构 | 0 | 3 | **模块化** |
|
||||
| 资源管理 | 手动 | RAII | **自动化** |
|
||||
| 代码复用 | ❌ | ✅ | **提升** |
|
||||
| 单元测试 | ❌ | ✅ | **可测试** |
|
||||
|
||||
## 使用示例
|
||||
|
||||
### 重构前(原版)
|
||||
```cpp
|
||||
int main() {
|
||||
InitializeWinsock();
|
||||
InitializeSSL();
|
||||
ConnectToServer();
|
||||
// ... 大量代码 ...
|
||||
Cleanup(); // 必须手动清理
|
||||
}
|
||||
```
|
||||
|
||||
### 重构后
|
||||
```cpp
|
||||
int main() {
|
||||
SSLClientConnection client; // 对象创建
|
||||
|
||||
client.Initialize( // 初始化
|
||||
CertificateConfig::GetClientCertificate(),
|
||||
CertificateConfig::GetClientPrivateKey(),
|
||||
CertificateConfig::GetCACertificate(),
|
||||
CertificateConfig::GetKeyPassword()
|
||||
);
|
||||
|
||||
client.Connect("127.0.0.1", 5555); // 连接
|
||||
client.Send("hello"); // 发送
|
||||
|
||||
// 自动清理 - 无需调用Cleanup()
|
||||
}
|
||||
```
|
||||
|
||||
## 文件说明
|
||||
|
||||
### 📦 CertificateConfig.h/cpp
|
||||
```cpp
|
||||
namespace SSLClient {
|
||||
class CertificateConfig {
|
||||
public:
|
||||
static const char* GetClientCertificate();
|
||||
static const char* GetClientPrivateKey();
|
||||
static const char* GetCACertificate();
|
||||
static const char* GetKeyPassword();
|
||||
};
|
||||
}
|
||||
```
|
||||
- **职责**: 提供证书数据访问接口
|
||||
- **特点**: 静态方法,无需实例化
|
||||
|
||||
### 📦 CertificateManager.h/cpp
|
||||
```cpp
|
||||
namespace SSLClient {
|
||||
class CertificateManager {
|
||||
public:
|
||||
X509* LoadCertificateFromMemory(const char* certPem);
|
||||
EVP_PKEY* LoadPrivateKeyFromMemory(const char* keyPem, const char* password);
|
||||
static void PrintSSLError(const char* message);
|
||||
};
|
||||
}
|
||||
```
|
||||
- **职责**: 证书/密钥加载工具
|
||||
- **特点**: 可复用的工具类
|
||||
|
||||
### 📦 SSLClientConnection.h/cpp
|
||||
```cpp
|
||||
namespace SSLClient {
|
||||
class SSLClientConnection {
|
||||
public:
|
||||
bool Initialize(const char* clientCert, const char* clientKey,
|
||||
const char* caCert, const char* keyPassword);
|
||||
bool Connect(const char* address, int port);
|
||||
bool Send(const std::string& data);
|
||||
int Receive(char* buffer, int bufferSize);
|
||||
void Disconnect();
|
||||
bool IsConnected() const;
|
||||
|
||||
private:
|
||||
SSL_CTX* m_sslContext;
|
||||
SSL* m_ssl;
|
||||
SOCKET m_socket;
|
||||
bool m_isConnected;
|
||||
CertificateManager m_certManager;
|
||||
};
|
||||
}
|
||||
```
|
||||
- **职责**: 完整的SSL客户端实现
|
||||
- **特点**: RAII,自动资源管理
|
||||
|
||||
## 编译项目
|
||||
|
||||
项目文件 `Client-Native.vcxproj` 已更新,包含所有新文件:
|
||||
|
||||
```xml
|
||||
<ClCompile Include="CertificateConfig.cpp" />
|
||||
<ClCompile Include="CertificateManager.cpp" />
|
||||
<ClCompile Include="SSLClientConnection.cpp" />
|
||||
<ClCompile Include="main.cpp" />
|
||||
<ClCompile Include="pch.cpp" />
|
||||
```
|
||||
|
||||
### 在 Visual Studio 中编译
|
||||
1. 打开 `TestEcho-SSL-Console.sln`
|
||||
2. 选择 `Client-Native` 项目
|
||||
3. 配置:Debug/Release,x64/x86
|
||||
4. 生成解决方案(Ctrl+Shift+B)
|
||||
|
||||
### 命令行编译
|
||||
```powershell
|
||||
# 使用 MSBuild
|
||||
MSBuild TestEcho-SSL-Console.sln /t:Client-Native /p:Configuration=Debug /p:Platform=x64
|
||||
```
|
||||
|
||||
## 功能验证
|
||||
|
||||
重构后的功能与原版**完全一致**:
|
||||
- ✅ SSL双向认证(SSL_VM_PEER)
|
||||
- ✅ 连接到 127.0.0.1:5555
|
||||
- ✅ 发送"hello"消息
|
||||
- ✅ 接收服务器echo响应
|
||||
- ✅ UTF-8中文显示
|
||||
- ✅ 交互式命令菜单
|
||||
|
||||
## 设计模式应用
|
||||
|
||||
1. **RAII (Resource Acquisition Is Initialization)**
|
||||
- `SSLClientConnection` 析构函数自动释放 SSL/Socket 资源
|
||||
|
||||
2. **Single Responsibility Principle (单一职责原则)**
|
||||
- 每个类只做一件事
|
||||
|
||||
3. **Encapsulation (封装)**
|
||||
- 私有成员 + 公共接口
|
||||
- 隐藏实现细节
|
||||
|
||||
4. **Static Factory (静态工厂)**
|
||||
- `CertificateConfig` 提供静态方法
|
||||
|
||||
5. **Manager Pattern (管理器模式)**
|
||||
- `CertificateManager` 统一管理证书加载
|
||||
|
||||
## 学习价值
|
||||
|
||||
### 对比两个版本
|
||||
- **原版** (`main.cpp.backup`): 快速了解OpenSSL API使用
|
||||
- **重构版**: 学习现代C++工程实践
|
||||
|
||||
### 适用场景
|
||||
| 场景 | 推荐版本 |
|
||||
|------|---------|
|
||||
| 快速原型开发 | 原版 |
|
||||
| 生产级项目 | 重构版 |
|
||||
| 学习OpenSSL API | 原版 |
|
||||
| 学习软件工程 | 重构版 |
|
||||
| 单元测试 | 重构版 |
|
||||
| 代码复用 | 重构版 |
|
||||
|
||||
## 未来扩展
|
||||
|
||||
模块化结构便于添加新功能:
|
||||
|
||||
1. **配置文件支持**
|
||||
```cpp
|
||||
class ConfigReader {
|
||||
ServerConfig ReadConfig(const std::string& file);
|
||||
};
|
||||
```
|
||||
|
||||
2. **日志系统**
|
||||
```cpp
|
||||
class Logger {
|
||||
void Info(const std::string& msg);
|
||||
void Error(const std::string& msg);
|
||||
};
|
||||
```
|
||||
|
||||
3. **异步IO**
|
||||
```cpp
|
||||
class AsyncSSLClient : public SSLClientConnection {
|
||||
std::future<bool> ConnectAsync(...);
|
||||
std::future<int> ReceiveAsync(...);
|
||||
};
|
||||
```
|
||||
|
||||
4. **智能指针**
|
||||
```cpp
|
||||
std::unique_ptr<SSL, SSLDeleter> m_ssl;
|
||||
std::unique_ptr<SSL_CTX, SSLContextDeleter> m_sslContext;
|
||||
```
|
||||
|
||||
## 总结
|
||||
|
||||
通过这次重构:
|
||||
- ✅ 将 462 行代码精简到 122 行主程序
|
||||
- ✅ 消除所有全局变量
|
||||
- ✅ 实现 RAII 自动资源管理
|
||||
- ✅ 提高代码可读性和可维护性
|
||||
- ✅ 增强可测试性和复用性
|
||||
- ✅ 遵循现代 C++ 最佳实践
|
||||
|
||||
**原版和重构版功能完全相同**,但代码质量显著提升!
|
||||
|
||||
---
|
||||
📝 **备注**: 原始文件已备份为 `main.cpp.backup`,可随时恢复。
|
||||
Reference in New Issue
Block a user