Files
--hp-socket-TCP--ssl--/Client-Native/重构总结.md
2026-01-23 08:39:07 +08:00

7.0 KiB
Raw Blame History

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 中编译

  1. 打开 TestEcho-SSL-Console.sln
  2. 选择 Client-Native 项目
  3. 配置Debug/Releasex64/x86
  4. 生成解决方案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中文显示
  • 交互式命令菜单

设计模式应用

  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. 配置文件支持

    class ConfigReader {
        ServerConfig ReadConfig(const std::string& file);
    };
    
  2. 日志系统

    class Logger {
        void Info(const std::string& msg);
        void Error(const std::string& msg);
    };
    
  3. 异步IO

    class AsyncSSLClient : public SSLClientConnection {
        std::future<bool> ConnectAsync(...);
        std::future<int> ReceiveAsync(...);
    };
    
  4. 智能指针

    std::unique_ptr<SSL, SSLDeleter> m_ssl;
    std::unique_ptr<SSL_CTX, SSLContextDeleter> m_sslContext;
    

总结

通过这次重构:

  • 将 462 行代码精简到 122 行主程序
  • 消除所有全局变量
  • 实现 RAII 自动资源管理
  • 提高代码可读性和可维护性
  • 增强可测试性和复用性
  • 遵循现代 C++ 最佳实践

原版和重构版功能完全相同,但代码质量显著提升!


📝 备注: 原始文件已备份为 main.cpp.backup,可随时恢复。