{"id":1062,"date":"2023-09-17T16:43:18","date_gmt":"2023-09-17T08:43:18","guid":{"rendered":"https:\/\/www.fanyamin.com\/wordpress\/?p=1062"},"modified":"2023-09-17T16:49:11","modified_gmt":"2023-09-17T08:49:11","slug":"multi-user-chat","status":"publish","type":"post","link":"https:\/\/www.fanyamin.com\/wordpress\/?p=1062","title":{"rendered":"multi user chat by boost beast"},"content":{"rendered":"<h1>overview<\/h1>\n<pre><code>@startuml\nmain -&gt; io_context: construct\nmain -&gt; shared_state: construct\nmain -&gt; listener: construct\nmain -&gt; listener : run\n@enduml<\/code><\/pre>\n<h1>classes<\/h1>\n<p><img decoding=\"async\" src=\"https:\/\/www.fanyamin.com\/wordpress\/wp-content\/uploads\/2023\/09\/image-1694940106697.png\" alt=\"\" \/><\/p>\n<pre><code>\n@startuml\nclass http_session \n{\n    beast::tcp_stream stream_;\n    beast::flat_buffer buffer_;\n    boost::shared_ptr<shared_state> state_;\n\n    boost::optional<http::request_parser<http::string_body>> parser_;\n\n    struct send_lambda;\n\n    void fail(beast::error_code ec, char const* what);\n    void do_read();\n    void on_read(beast::error_code ec, std::size_t);\n    void on_write(beast::error_code ec, std::size_t, bool close);\n\n    void run();\n}\nclass websocket_session \n{\n    beast::flat_buffer buffer_;\n    websocket::stream<beast::tcp_stream> ws_;\n    boost::shared_ptr<shared_state> state_;\n    std::vector<boost::shared_ptr<std::string const>> queue_;\n\n    void fail(beast::error_code ec, char const* what);\n    void on_accept(beast::error_code ec);\n    void on_read(beast::error_code ec, std::size_t bytes_transferred);\n    void on_write(beast::error_code ec, std::size_t bytes_transferred);\n\n    void run(http::request<Body, http::basic_fields<Allocator>> req);\n\n    void send(boost::shared_ptr<std::string const> const& ss);\n\n    void on_send(boost::shared_ptr<std::string const> const& ss);  \n}\nclass shared_state \n{\n    std::string const doc_root_;\n    std::mutex mutex_;\n    std::unordered_set<websocket_session*> sessions_;\n\n    void join  (websocket_session* session);\n    void leave (websocket_session* session);\n    void send  (std::string message);\n\n}\nclass listener\n{\n    net::io_context& ioc_;\n    tcp::acceptor acceptor_;\n    boost::shared_ptr<shared_state> state_;\n\n    void fail(beast::error_code ec, char const* what);\n    void on_accept(beast::error_code ec, tcp::socket socket);\n\n    void run();\n}\n\nshared_state o-- websocket_session\nlistener <-- shared_state\nhttp_session <-- shared_state\nwebsocket_session <-- shared_state\n@enduml\n``<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>overview @startuml main -&gt; io_context: construct main -&gt; shared_state: construct main -&gt; listener: construct main -&gt; listener : run @enduml classes @startuml class http_session { beast::tcp_stream stream_; beast::flat_buffer buffer_; boost::shared_ptr state_; boost::optional parser_; struct send_lambda; void fail(beast::error_code ec, char const* what); void do_read(); void on_read(beast::error_code ec, std::size_t); void on_write(beast::error_code ec, std::size_t, bool close); void run(); [&hellip;] <a class=\"read-more\" href=\"https:\/\/www.fanyamin.com\/wordpress\/?p=1062\" title=\"Permanent Link to: multi user chat by boost beast\">&rarr;Read&nbsp;more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1062","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1062"}],"collection":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1062"}],"version-history":[{"count":2,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1062\/revisions"}],"predecessor-version":[{"id":1065,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1062\/revisions\/1065"}],"wp:attachment":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1062"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1062"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1062"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}