#pragma once #include "SocketWrapper.h" #include #include #include #include #include // 前向声明 class GameServer; /** * @brief 客户端状态枚举 */ enum class ClientState { Unauthenticated, // 未认证 Lobby, // 大厅中 InBattle // 战斗中 }; /** * @brief 客户端处理器 * * 技术点: * 1. STL - std::thread (多线程) * 2. 网络编程 - Socket 通信 */ class ClientHandler : public std::enable_shared_from_this { private: int m_clientId; SocketFd m_socketFd; GameServer* m_server; std::thread m_thread; std::atomic m_isRunning; // 客户端状态 ClientState m_state; std::string m_username; int m_userId; // 战斗相关 std::string m_pendingInviter; // 待处理的邀请者 int m_battleRoomId; // 所在战斗房间ID public: /** * @brief 构造函数 */ ClientHandler(int clientId, SocketFd socketFd, GameServer* server); /** * @brief 析构函数 */ ~ClientHandler(); // 禁止拷贝 ClientHandler(const ClientHandler&) = delete; ClientHandler& operator=(const ClientHandler&) = delete; /** * @brief 启动处理线程 */ void start(); /** * @brief 停止处理 */ void stop(); /** * @brief 发送消息 */ bool sendMessage(const std::string& message); /** * @brief 获取客户端ID */ int getClientId() const { return m_clientId; } /** * @brief 获取用户名 */ std::string getUsername() const { return m_username; } /** * @brief 获取用户ID */ int getUserId() const { return m_userId; } /** * @brief 获取状态 */ ClientState getState() const { return m_state; } /** * @brief 设置状态 */ void setState(ClientState state) { m_state = state; } /** * @brief 设置战斗房间ID */ void setBattleRoomId(int roomId) { m_battleRoomId = roomId; } /** * @brief 获取战斗房间ID */ int getBattleRoomId() const { return m_battleRoomId; } /** * @brief 设置待处理邀请 */ void setPendingInviter(const std::string& inviter) { m_pendingInviter = inviter; } /** * @brief 获取待处理邀请 */ std::string getPendingInviter() const { return m_pendingInviter; } private: /** * @brief 线程主循环 */ void run(); /** * @brief 处理客户端命令 */ void handleCommand(const std::string& command, const std::vector& params); /** * @brief 处理注册 */ void handleRegister(const std::vector& params); /** * @brief 处理登录 */ void handleLogin(const std::vector& params); /** * @brief 处理聊天 */ void handleChat(const std::vector& params); /** * @brief 处理玩家列表请求 */ void handleListPlayers(); /** * @brief 处理邀请 */ void handleInvite(const std::vector& params); /** * @brief 处理邀请响应 */ void handleInviteResponse(const std::vector& params); /** * @brief 处理战斗行动 */ void handleBattleAction(const std::vector& params); /** * @brief 处理登出 */ void handleLogout(); };