#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace beast = boost::beast; namespace http = beast::http; namespace websocket = beast::websocket; namespace net = boost::asio; using tcp = boost::asio::ip::tcp; // 前向声明 class WebSocketHandler; class WebSocketSession : public std::enable_shared_from_this { public: using MessageHandler = std::function, const std::string&)>; private: websocket::stream ws_; beast::flat_buffer buffer_; http::request req_; std::mutex send_mutex_; std::queue> send_queue_; std::shared_ptr current_message_; // 添加这个成员变量 bool is_sending_ = false; std::atomic closed_{false}; MessageHandler message_handler_; // 添加对WebSocketHandler的引用 std::shared_ptr websocket_handler_; public: explicit WebSocketSession(tcp::socket&& socket, http::request req); ~WebSocketSession(); void run(); void safe_send(std::shared_ptr message); void close(); void set_message_handler(MessageHandler handler); // 添加设置WebSocketHandler的方法 void set_websocket_handler(std::shared_ptr handler) { websocket_handler_ = handler; } private: void on_accept(beast::error_code ec); void do_read(); void on_read(beast::error_code ec, std::size_t bytes_transferred); void do_write(); void on_write(beast::error_code ec, std::size_t bytes_transferred); };