/** * @file NetworkServer.h * * @author Yuzhe Guo * @date 2025.11.25 */ #pragma once #include "Message.h" #include #include #include namespace UNO::NETWORK { class Session : public std::enable_shared_from_this { private: size_t player_id_; asio::ip::tcp::socket socket_; std::function callback_; public: Session(size_t player_id, asio::ip::tcp::socket socket); /** * 开始从网络读取消息 * @param callback 回调函数 */ void start(std::function callback); /** * 发送消息 * @param message 要发送的消息 */ void send(const std::string &message); private: void read(); void readBody(size_t length); }; class NetworkServer { private: asio::io_context io_context_; asio::ip::tcp::acceptor acceptor_; size_t playerCount; std::map> sessions_; std::function callback_; std::mutex mutex_; public: explicit NetworkServer(uint16_t port, std::function callback); /** * 添加玩家 * @param socket 玩家的连接 socket */ void addPlayer(asio::ip::tcp::socket socket); /** * 向玩家发送消息 * @param id 要发送到的玩家 id * @param message 要发送的消息 */ void send(size_t id, const std::string &message); /** * 开始网络进程 */ void run(); /** * 停止网络进程 */ void stop(); private: void accept(); }; } // namespace UNO::NETWORK