7.0 KiB
7.0 KiB
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. 面向对象
// 原版:全局变量 + 函数
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资源管理
{
SSLClientConnection client; // 构造函数初始化
client.Initialize(...);
client.Connect(...);
// ...
} // 析构函数自动清理资源 - 无需手动Cleanup()
4. 单一职责原则
每个模块只负责一件事:
- 📋 CertificateConfig → 提供证书
- 🔐 CertificateManager → 加载证书
- 🌐 SSLClientConnection → SSL通信
- 🎮 main → 用户交互
代码对比
| 特性 | 原版 | 重构版 | 改进 |
|---|---|---|---|
| main.cpp行数 | 462 | 122 | -73.6% |
| 全局变量 | 3个 | 0个 | 消除 |
| 类/结构 | 0 | 3 | 模块化 |
| 资源管理 | 手动 | RAII | 自动化 |
| 代码复用 | ❌ | ✅ | 提升 |
| 单元测试 | ❌ | ✅ | 可测试 |
使用示例
重构前(原版)
int main() {
InitializeWinsock();
InitializeSSL();
ConnectToServer();
// ... 大量代码 ...
Cleanup(); // 必须手动清理
}
重构后
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
namespace SSLClient {
class CertificateConfig {
public:
static const char* GetClientCertificate();
static const char* GetClientPrivateKey();
static const char* GetCACertificate();
static const char* GetKeyPassword();
};
}
- 职责: 提供证书数据访问接口
- 特点: 静态方法,无需实例化
📦 CertificateManager.h/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
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 已更新,包含所有新文件:
<ClCompile Include="CertificateConfig.cpp" />
<ClCompile Include="CertificateManager.cpp" />
<ClCompile Include="SSLClientConnection.cpp" />
<ClCompile Include="main.cpp" />
<ClCompile Include="pch.cpp" />
在 Visual Studio 中编译
- 打开
TestEcho-SSL-Console.sln - 选择
Client-Native项目 - 配置:Debug/Release,x64/x86
- 生成解决方案(Ctrl+Shift+B)
命令行编译
# 使用 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中文显示
- ✅ 交互式命令菜单
设计模式应用
-
RAII (Resource Acquisition Is Initialization)
SSLClientConnection析构函数自动释放 SSL/Socket 资源
-
Single Responsibility Principle (单一职责原则)
- 每个类只做一件事
-
Encapsulation (封装)
- 私有成员 + 公共接口
- 隐藏实现细节
-
Static Factory (静态工厂)
CertificateConfig提供静态方法
-
Manager Pattern (管理器模式)
CertificateManager统一管理证书加载
学习价值
对比两个版本
- 原版 (
main.cpp.backup): 快速了解OpenSSL API使用 - 重构版: 学习现代C++工程实践
适用场景
| 场景 | 推荐版本 |
|---|---|
| 快速原型开发 | 原版 |
| 生产级项目 | 重构版 |
| 学习OpenSSL API | 原版 |
| 学习软件工程 | 重构版 |
| 单元测试 | 重构版 |
| 代码复用 | 重构版 |
未来扩展
模块化结构便于添加新功能:
-
配置文件支持
class ConfigReader { ServerConfig ReadConfig(const std::string& file); }; -
日志系统
class Logger { void Info(const std::string& msg); void Error(const std::string& msg); }; -
异步IO
class AsyncSSLClient : public SSLClientConnection { std::future<bool> ConnectAsync(...); std::future<int> ReceiveAsync(...); }; -
智能指针
std::unique_ptr<SSL, SSLDeleter> m_ssl; std::unique_ptr<SSL_CTX, SSLContextDeleter> m_sslContext;
总结
通过这次重构:
- ✅ 将 462 行代码精简到 122 行主程序
- ✅ 消除所有全局变量
- ✅ 实现 RAII 自动资源管理
- ✅ 提高代码可读性和可维护性
- ✅ 增强可测试性和复用性
- ✅ 遵循现代 C++ 最佳实践
原版和重构版功能完全相同,但代码质量显著提升!
📝 备注: 原始文件已备份为 main.cpp.backup,可随时恢复。