This commit is contained in:
2025-10-11 23:37:00 +08:00
parent d32f0e9f90
commit 5f768f2cdc
2 changed files with 202 additions and 5 deletions

View File

@@ -78,6 +78,83 @@ namespace QCL
std::mutex clientsMutex_; ///< 保护clientSockets_的互斥锁
std::vector<int> clientSockets_; ///< 当前所有连接的客户端Socket集合
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @class TcpClient
* @brief 简单的TCP客户端类支持自动连接、消息收发及断线重连
*
* 该类用于连接指定服务器IP与端口
* 支持发送与接收字符串消息,
* 并提供自动重连与线程安全的消息接收。
*/
class TcpClient
{
public:
/**
* @brief 构造函数指定服务器IP与端口
* @param serverIP 服务器IP地址
* @param serverPort 服务器端口号
*/
TcpClient(const std::string &serverIP, int serverPort);
/**
* @brief 析构函数,自动断开连接并清理资源
*/
~TcpClient();
/**
* @brief 连接服务器
* @return 连接成功返回true失败返回false
*/
bool connectToServer();
/**
* @brief 断开与服务器的连接
*/
void disconnect();
/**
* @brief 向服务器发送字符串消息
* @param message 要发送的字符串
*/
void sendToServer(const std::string &message);
/**
* @brief 从服务器接收数据(单次调用)
* @param flag false: 非阻塞模式, true: 阻塞模式
* @return 收到的数据字符串(若无数据返回空字符串)
*/
std::string receiveFromServer(bool flag = true);
/**
* @brief 获取当前连接的服务器IP和端口
* @return 字符串形式的 "IP:Port"
*/
std::string getServerIPAndPort() const;
/**
* @brief 判断客户端当前是否已连接
* @return 已连接返回true否则返回false
*/
bool isConnected() const;
private:
/**
* @brief 尝试自动重连服务器(可选)
* @param retryIntervalMs 重连间隔,单位毫秒
*/
void reconnectLoop(int retryIntervalMs = 3000);
private:
int clientSock_; ///< 客户端Socket描述符
std::string serverIP_; ///< 服务器IP地址
int serverPort_; ///< 服务器端口号
std::atomic<bool> connected_; ///< 连接状态标志(线程安全)
std::atomic<bool> running_; ///< 是否保持运行(用于自动重连)
std::thread reconnectThread_; ///< 自动重连线程(可选)
mutable std::mutex socketMutex_; ///< 保护socket的互斥锁
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @brief 文件写入工具类(线程安全)