Несколько 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".
Клиент выведет три строки ответа.