54 constexpr uint16_t port = 9001;
59 .server_id =
"ChatServer",
63 std::mutex sessions_mutex;
64 std::map<std::string, std::shared_ptr<interfaces::i_session>> sessions;
66 server->set_connection_callback(
67 [&sessions, &sessions_mutex](std::shared_ptr<interfaces::i_session> session) {
68 std::lock_guard<std::mutex> lock(sessions_mutex);
69 std::string id(session->id());
70 sessions[id] = session;
71 std::cout <<
"[Server] User joined: " <<
id <<
" ("
72 << sessions.size() <<
" online)" << std::endl;
75 server->set_disconnection_callback(
76 [&sessions, &sessions_mutex](std::string_view session_id) {
77 std::lock_guard<std::mutex> lock(sessions_mutex);
78 sessions.erase(std::string(session_id));
79 std::cout <<
"[Server] User left: " << session_id <<
" ("
80 << sessions.size() <<
" online)" << std::endl;
84 server->set_receive_callback(
85 [&sessions, &sessions_mutex](std::string_view sender_id,
86 const std::vector<uint8_t>& data) {
87 std::string
message(data.begin(), data.end());
88 std::cout <<
"[Server] " << sender_id <<
" says: " <<
message << std::endl;
91 std::string broadcast = std::string(sender_id) +
": " +
message;
92 std::vector<uint8_t> broadcast_data(broadcast.begin(), broadcast.end());
94 std::lock_guard<std::mutex> lock(sessions_mutex);
95 for (
auto& [
id, session] : sessions) {
96 session->send(std::vector<uint8_t>(broadcast_data));
100 server->set_error_callback(
101 [](std::string_view session_id, std::error_code ec) {
102 std::cerr <<
"[Server] Error on " << session_id <<
": " << ec.message()
106 auto result = server->start(port);
107 if (result.is_err()) {
108 std::cerr <<
"[Server] Failed to start: " << result.error().message << std::endl;
112 std::cout <<
"[Server] Chat server running on ws://localhost:" << port <<
"/chat"
118 std::this_thread::sleep_for(std::chrono::milliseconds(100));
122 std::cout <<
"[Server] Stopped." << std::endl;
128void run_client(
const std::string& name,
const std::vector<std::string>& messages) {
131 std::this_thread::sleep_for(std::chrono::milliseconds(50));
133 std::this_thread::sleep_for(std::chrono::milliseconds(200));
141 client->set_receive_callback([&name](
const std::vector<uint8_t>& data) {
142 std::string msg(data.begin(), data.end());
143 std::cout <<
" [" << name <<
" received] " << msg << std::endl;
146 client->set_error_callback([&name](std::error_code ec) {
147 std::cerr <<
" [" << name <<
"] Error: " << ec.message() << std::endl;
151 auto connect_result = client->start(
"127.0.0.1", 9001);
152 if (connect_result.is_err()) {
153 std::cerr <<
" [" << name <<
"] Connection failed: "
154 << connect_result.error().message << std::endl;
158 std::this_thread::sleep_for(std::chrono::milliseconds(200));
161 for (
const auto& msg : messages) {
162 std::vector<uint8_t> data(msg.begin(), msg.end());
163 auto send_result = client->send(std::move(data));
164 if (send_result.is_err()) {
165 std::cerr <<
" [" << name <<
"] Send failed: "
166 << send_result.error().message << std::endl;
168 std::this_thread::sleep_for(std::chrono::milliseconds(600));
171 std::this_thread::sleep_for(std::chrono::milliseconds(500));