WebSocketSession.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #pragma once
  2. #include <boost/beast/core.hpp>
  3. #include <boost/beast/http.hpp>
  4. #include <boost/beast/websocket.hpp>
  5. #include <boost/asio/ip/tcp.hpp>
  6. #include <boost/asio/strand.hpp>
  7. #include <boost/asio/dispatch.hpp>
  8. #include <cstdlib>
  9. #include <functional>
  10. #include <iostream>
  11. #include <memory>
  12. #include <string>
  13. #include <thread>
  14. #include <mutex>
  15. #include <queue>
  16. #include <atomic>
  17. namespace beast = boost::beast;
  18. namespace http = beast::http;
  19. namespace websocket = beast::websocket;
  20. namespace net = boost::asio;
  21. using tcp = boost::asio::ip::tcp;
  22. // 前向声明
  23. class WebSocketHandler;
  24. class WebSocketSession : public std::enable_shared_from_this<WebSocketSession> {
  25. public:
  26. using MessageHandler = std::function<void(std::shared_ptr<WebSocketSession>, const std::string&)>;
  27. private:
  28. websocket::stream<beast::tcp_stream> ws_;
  29. beast::flat_buffer buffer_;
  30. http::request<http::dynamic_body> req_;
  31. std::mutex send_mutex_;
  32. std::queue<std::shared_ptr<std::string>> send_queue_;
  33. std::shared_ptr<std::string> current_message_; // 添加这个成员变量
  34. bool is_sending_ = false;
  35. std::atomic<bool> closed_{false};
  36. MessageHandler message_handler_;
  37. // 添加对WebSocketHandler的引用
  38. std::shared_ptr<WebSocketHandler> websocket_handler_;
  39. public:
  40. explicit WebSocketSession(tcp::socket&& socket, http::request<http::dynamic_body> req);
  41. ~WebSocketSession();
  42. void run();
  43. void safe_send(std::shared_ptr<std::string> message);
  44. void close();
  45. void set_message_handler(MessageHandler handler);
  46. // 添加设置WebSocketHandler的方法
  47. void set_websocket_handler(std::shared_ptr<WebSocketHandler> handler) { websocket_handler_ = handler; }
  48. private:
  49. void on_accept(beast::error_code ec);
  50. void do_read();
  51. void on_read(beast::error_code ec, std::size_t bytes_transferred);
  52. void do_write();
  53. void on_write(beast::error_code ec, std::size_t bytes_transferred);
  54. };