mirror of
https://github.com/ChuXunYu/OnlineRpg.git
synced 2026-01-31 13:35:45 +00:00
173 lines
3.4 KiB
C++
173 lines
3.4 KiB
C++
#pragma once
|
|
#include "SocketWrapper.h"
|
|
#include <string>
|
|
#include <thread>
|
|
#include <atomic>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
// 前向声明
|
|
class GameServer;
|
|
|
|
/**
|
|
* @brief 客户端状态枚举
|
|
*/
|
|
enum class ClientState {
|
|
Unauthenticated, // 未认证
|
|
Lobby, // 大厅中
|
|
InBattle // 战斗中
|
|
};
|
|
|
|
/**
|
|
* @brief 客户端处理器
|
|
*
|
|
* 技术点:
|
|
* 1. STL - std::thread (多线程)
|
|
* 2. 网络编程 - Socket 通信
|
|
*/
|
|
class ClientHandler : public std::enable_shared_from_this<ClientHandler> {
|
|
private:
|
|
int m_clientId;
|
|
SocketFd m_socketFd;
|
|
GameServer* m_server;
|
|
|
|
std::thread m_thread;
|
|
std::atomic<bool> 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<std::string>& params);
|
|
|
|
/**
|
|
* @brief 处理注册
|
|
*/
|
|
void handleRegister(const std::vector<std::string>& params);
|
|
|
|
/**
|
|
* @brief 处理登录
|
|
*/
|
|
void handleLogin(const std::vector<std::string>& params);
|
|
|
|
/**
|
|
* @brief 处理聊天
|
|
*/
|
|
void handleChat(const std::vector<std::string>& params);
|
|
|
|
/**
|
|
* @brief 处理玩家列表请求
|
|
*/
|
|
void handleListPlayers();
|
|
|
|
/**
|
|
* @brief 处理邀请
|
|
*/
|
|
void handleInvite(const std::vector<std::string>& params);
|
|
|
|
/**
|
|
* @brief 处理邀请响应
|
|
*/
|
|
void handleInviteResponse(const std::vector<std::string>& params);
|
|
|
|
/**
|
|
* @brief 处理战斗行动
|
|
*/
|
|
void handleBattleAction(const std::vector<std::string>& params);
|
|
|
|
/**
|
|
* @brief 处理登出
|
|
*/
|
|
void handleLogout();
|
|
};
|