// WebSocketServer.hpp - WebSocket服务器头文件 // 基于Boost.Beast和Boost.Asio #ifndef PMC_NET_WEBSOCKETSERVER_HPP #define PMC_NET_WEBSOCKETSERVER_HPP #include #include #include #include #include #include #include #include #include #include namespace pmc::net { /** * @brief WebSocket连接处理器类型定义 * * 处理WebSocket连接建立后的消息收发 */ using WebSocketMessageHandler = std::function sendCallback)>; /** * @brief WebSocket连接回调类型定义 */ using WebSocketConnectHandler = std::function; /** * @brief WebSocket断开连接回调类型定义 */ using WebSocketDisconnectHandler = std::function; /** * @brief WebSocket服务器类 * * 基于Boost.Beast和Boost.Asio实现的WebSocket服务器 */ class WebSocketServer { public: /** * @brief 构造函数 * @param port 监听端口 * @param threads 线程数(默认2) */ WebSocketServer(unsigned short port, unsigned int threads = 2); /** * @brief 析构函数 */ ~WebSocketServer(); /** * @brief 启动服务器 */ void start(); /** * @brief 停止服务器 */ void stop(); /** * @brief 注册消息处理器 * @param path 路径(用于路由) * @param handler 消息处理器 */ void onMessage(const std::string& path, WebSocketMessageHandler handler); /** * @brief 注册连接处理器 * @param handler 连接处理器 */ void onConnect(WebSocketConnectHandler handler); /** * @brief 注册断开连接处理器 * @param handler 断开连接处理器 */ void onDisconnect(WebSocketDisconnectHandler handler); /** * @brief 向指定客户端发送消息 * @param clientId 客户端ID * @param message 消息内容 * @return 是否发送成功 */ bool sendToClient(const std::string& clientId, const std::string& message); /** * @brief 向所有客户端广播消息 * @param message 消息内容 * @return 成功发送的客户端数量 */ size_t broadcast(const std::string& message); /** * @brief 断开指定客户端连接 * @param clientId 客户端ID */ void disconnectClient(const std::string& clientId); /** * @brief 获取当前连接的客户端数量 * @return 客户端数量 */ size_t getClientCount() const; /** * @brief 获取服务器是否正在运行 * @return 运行状态 */ bool isRunning() const { return running_; } /** * @brief 获取服务器监听端口 * @return 端口号 */ unsigned short getPort() const { return port_; } private: // 内部Session类 class Session; // 内部Listener类 class Listener; // 内部实现结构体 struct Impl { boost::asio::io_context ioc_; std::shared_ptr listener_; std::vector threads_; }; // 服务器配置 unsigned short port_; unsigned int threads_; std::atomic running_{false}; // 内部实现 std::unique_ptr impl_; // 生成客户端ID std::string generateClientId() const; // 添加客户端 void addClient(const std::string& clientId, std::shared_ptr session); // 移除客户端 void removeClient(const std::string& clientId); // 获取客户端Session std::shared_ptr getClient(const std::string& clientId); // 回调函数 std::unordered_map messageHandlers_; WebSocketConnectHandler connectHandler_; WebSocketDisconnectHandler disconnectHandler_; // 客户端管理 mutable std::mutex clientsMutex_; std::unordered_map> clients_; }; } // namespace pmc::net #endif // PMC_NET_WEBSOCKETSERVER_HPP