// WebSocketServer.hpp - WebSocket server header file // Based on Boost.Beast and 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 connection handler type definition * * Handles message sending and receiving after WebSocket connection is established */ using WebSocketMessageHandler = std::function sendCallback)>; /** * @brief WebSocket connection callback type definition */ using WebSocketConnectHandler = std::function; /** * @brief WebSocket disconnection callback type definition */ using WebSocketDisconnectHandler = std::function; /** * @brief WebSocket server class * * WebSocket server implemented based on Boost.Beast and Boost.Asio */ class WebSocketServer { public: /** * @brief Constructor * @param port Listening port * @param threads Number of threads (default 2) */ WebSocketServer(unsigned short port, unsigned int threads = 2); /** * @brief Destructor */ ~WebSocketServer(); /** * @brief Start the server */ void start(); /** * @brief Stop the server */ void stop(); /** * @brief Register message handler * @param path Path (for routing) * @param handler Message handler */ void onMessage(const std::string& path, WebSocketMessageHandler handler); /** * @brief Register connection handler * @param handler Connection handler */ void onConnect(WebSocketConnectHandler handler); /** * @brief Register disconnection handler * @param handler Disconnection handler */ void onDisconnect(WebSocketDisconnectHandler handler); /** * @brief Send message to a specific client * @param clientId Client ID * @param message Message content * @return Whether sending was successful */ bool sendToClient(const std::string& clientId, const std::string& message); /** * @brief Broadcast message to all clients * @param message Message content * @return Number of clients that successfully received the message */ size_t broadcast(const std::string& message); /** * @brief Disconnect a specific client * @param clientId Client ID */ void disconnectClient(const std::string& clientId); /** * @brief Get the number of currently connected clients * @return Number of clients */ size_t getClientCount() const; /** * @brief Check if the server is running * @return Running status */ bool isRunning() const { return running_; } /** * @brief Get the server listening port * @return Port number */ unsigned short getPort() const { return port_; } private: // Internal Session class class Session; // Internal Listener class class Listener; // Internal implementation structure struct Impl { boost::asio::io_context ioc_; std::shared_ptr listener_; std::vector threads_; }; // Server configuration unsigned short port_; unsigned int threads_; std::atomic running_{false}; // Internal implementation std::unique_ptr impl_; // Generate client ID std::string generateClientId() const; // Add client void addClient(const std::string& clientId, std::shared_ptr session); // Remove client void removeClient(const std::string& clientId); // Get client session std::shared_ptr getClient(const std::string& clientId); // Callback functions std::unordered_map messageHandlers_; WebSocketConnectHandler connectHandler_; WebSocketDisconnectHandler disconnectHandler_; // Client management mutable std::mutex clientsMutex_; std::unordered_map> clients_; }; } // namespace pmc::net #endif // PMC_NET_WEBSOCKETSERVER_HPP