#pragma once #include "SocketWrapper.h" #include "Database.h" #include #include #include #include #include // 前向声明 class ClientHandler; class GameLobby; class BattleRoomManager; /** * @brief 游戏服务器主类 * * 技术点: * 1. STL - std::map, std::mutex, std::thread * 2. 网络编程 - Socket Server */ class GameServer { private: int m_port; SocketWrapper m_serverSocket; std::shared_ptr m_database; // 客户端管理 (STL) std::map> m_clients; std::mutex m_clientsMutex; int m_nextClientId; // 游戏模块 std::shared_ptr m_lobby; std::shared_ptr m_battleManager; bool m_isRunning; public: /** * @brief 构造函数 * @param port 监听端口 * @param dbPath 数据库文件路径 */ GameServer(int port, const std::string& dbPath); /** * @brief 析构函数 */ ~GameServer(); /** * @brief 启动服务器 */ bool start(); /** * @brief 停止服务器 */ void stop(); /** * @brief 服务器主循环 (接受连接) */ void run(); /** * @brief 添加客户端 */ int addClient(std::shared_ptr client); /** * @brief 移除客户端 */ void removeClient(int clientId); /** * @brief 根据用户名获取客户端 */ std::shared_ptr getClientByUsername(const std::string& username); /** * @brief 获取所有在线玩家列表 */ std::vector getOnlinePlayers(); /** * @brief 广播消息给所有在大厅的客户端 */ void broadcastToLobby(const std::string& message, int excludeClientId = -1); /** * @brief 获取数据库 */ std::shared_ptr getDatabase() { return m_database; } /** * @brief 获取大厅 */ std::shared_ptr getLobby() { return m_lobby; } /** * @brief 获取战斗管理器 */ std::shared_ptr getBattleManager() { return m_battleManager; } /** * @brief 检查服务器是否运行中 */ bool isRunning() const { return m_isRunning; } };