Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpSpWsSev 693 of 696 menu
◀ ▶

Несколько WebSocket-сообщений в C++

Пока соединение открыто, клиент может вызывать send несколько раз подряд.

Сервер получает каждый кадр отдельным вызовом колбэка; ответы тоже шлют по одному на кадр. Приемник на стороне сервера считает сообщения в логике обработчика. Клиент ждет нужное число ответов через std::atomic:

#include <atomic> #include <iostream> #include <ixwebsocket/IXWebSocket.h> #include <ixwebsocket/IXWebSocketServer.h> int main() { std::atomic<bool> link_open{false}; std::atomic<int> left{2}; ix::WebSocketServer server(18082, "127.0.0.1"); server.setOnClientMessageCallback( [&](std::shared_ptr<ix::ConnectionState>, ix::WebSocket& peer, const ix::WebSocketMessagePtr& msg) { if (msg->type == ix::WebSocketMessageType::Message) { std::cout << msg->str << "\n"; peer.send(msg->str); } }); auto bound = server.listen(); if (!bound.first) { std::cerr << bound.second << "\n"; return 1; } server.start(); ix::WebSocket client; client.setUrl("ws://127.0.0.1:18082"); client.setOnMessageCallback( [&](const ix::WebSocketMessagePtr& msg) { if (msg->type == ix::WebSocketMessageType::Open) { link_open.store(true); link_open.notify_all(); } else if (msg->type == ix::WebSocketMessageType::Message) { int rest = left.fetch_sub(1) - 1; if (rest == 0) { left.notify_all(); } } }); client.start(); while (!link_open.load()) { link_open.wait(false); } client.send("a"); client.send("b"); while (left.load() > 0) { int seen = left.load(); left.wait(seen); } client.stop(); server.stop(); return 0; }

Если сервер на каждый кадр отвечает строкой, клиент уменьшает счетчик в колбэке и выводит ответы по мере прихода:

#include <atomic> #include <iostream> #include <string> #include <ixwebsocket/IXWebSocket.h> #include <ixwebsocket/IXWebSocketServer.h> int main() { std::atomic<bool> link_open{false}; std::atomic<int> left{2}; ix::WebSocketServer server(18082, "127.0.0.1"); server.setOnClientMessageCallback( [](std::shared_ptr<ix::ConnectionState>, ix::WebSocket& peer, const ix::WebSocketMessagePtr& msg) { if (msg->type == ix::WebSocketMessageType::Message) { std::string echo = "echo " + msg->str; peer.send(echo); } }); auto bound = server.listen(); if (!bound.first) { std::cerr << bound.second << "\n"; return 1; } server.start(); ix::WebSocket client; client.setUrl("ws://127.0.0.1:18082"); client.setOnMessageCallback( [&](const ix::WebSocketMessagePtr& msg) { if (msg->type == ix::WebSocketMessageType::Open) { link_open.store(true); link_open.notify_all(); } else if (msg->type == ix::WebSocketMessageType::Message) { std::cout << msg->str << "\n"; int rest = left.fetch_sub(1) - 1; if (rest == 0) { left.notify_all(); } } }); client.start(); while (!link_open.load()) { link_open.wait(false); } client.send("a"); client.send("b"); while (left.load() > 0) { int seen = left.load(); left.wait(seen); } client.stop(); server.stop(); return 0; }

Передайте пять кадров с текстами "n1" … "n5". Сервер выведет пять строк по одной на кадр.

Примите три запроса и на каждый верните "ok". Клиент выведет три строки ответа.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить