Клиент WebSocket в C++
Клиент WebSocket - объект ix::WebSocket с URL
схемы ws.
Метод setUrl задает адрес; start запускает фоновый
поток и рукопожатие. Событие открытия приходит в
setOnMessageCallback с типом Open, после чего
соединение готово к обмену строками.
Отправка текста - вызов send с английской фразой. Сервер
в фоне принимает кадр; клиент может не обрабатывать ответ, если
задача - только доставка:
#include <atomic>
#include <ixwebsocket/IXWebSocket.h>
#include <ixwebsocket/IXWebSocketServer.h>
int main() {
std::atomic<bool> link_open{false};
std::atomic<bool> frame_seen{false};
ix::WebSocketServer server(18082, "127.0.0.1");
server.setOnClientMessageCallback(
[&](std::shared_ptr<ix::ConnectionState>,
ix::WebSocket&,
const ix::WebSocketMessagePtr& msg) {
if (msg->type == ix::WebSocketMessageType::Message) {
frame_seen.store(true);
frame_seen.notify_all();
}
});
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();
}
});
client.start();
while (!link_open.load()) {
link_open.wait(false);
}
client.send("ping");
while (!frame_seen.load()) {
frame_seen.wait(false);
}
client.stop();
server.stop();
return 0;
}
Адрес ws://127.0.0.1:18082 совпадает с портом сервера.
Другой текст кладут в send без смены остального каркаса:
#include <atomic>
#include <ixwebsocket/IXWebSocket.h>
#include <ixwebsocket/IXWebSocketServer.h>
int main() {
std::atomic<bool> link_open{false};
std::atomic<bool> frame_seen{false};
ix::WebSocketServer server(18082, "127.0.0.1");
server.setOnClientMessageCallback(
[&](std::shared_ptr<ix::ConnectionState>,
ix::WebSocket&,
const ix::WebSocketMessagePtr& msg) {
if (msg->type == ix::WebSocketMessageType::Message) {
frame_seen.store(true);
frame_seen.notify_all();
}
});
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();
}
});
client.start();
while (!link_open.load()) {
link_open.wait(false);
}
client.send("hello");
while (!frame_seen.load()) {
frame_seen.wait(false);
}
client.stop();
server.stop();
return 0;
}
Подключитесь к локальному серверу на 127.0.0.1 и
передайте строку "time". Сервер должен принять
один кадр.
Отправьте на 127.0.0.1 текст "job 3" после
события открытия в колбэке клиента.