Как правильно использовать метод QWebSocket :: sendBinaryMessage () из клиента C ++? - PullRequest
0 голосов
/ 05 сентября 2018

Есть C ++ Qt клиент и сервер. Следующий код работает нормально, и соединение между клиентом и сервером происходит:

QWebSocket webSocket;  // defined somewhere
...
QUrl url;
url.setScheme("ws");  // SSL encryption disabled
url.setHost(serverName);  // "127.0.0.1" (can be "www.abc.com" too)
url.setPort(portNumber);  // 2000
webSocket.open(url);  // connects with the server properly
PRINT(url.toString());  // output: "ws://127.0.0.1:2000"

При отправке двоичных данных функция возвращает 0 вместо количества байтов:

// though the message.size() is 80 bytes; the method returns 0
webSocket.sendBinaryMessage(QByteArray(message.data(), message.size()));

Обратите внимание, что QWebSocketServer работает как положено.
У нас также есть клиент Javascript. Это соединяет и отправляет двоичное сообщение правильно. Единственное дополнение в этом клиенте ниже:

webSocketJS.binaryType = "arraybuffer";  // <--- Javascript code

Но такого положения нет в QWebSocket, или я, возможно, пропустил его.

Вопрос : Как правильно отправить двоичные данные через веб-соединение?


Для тех, кто заинтересован, [псевдо] код сервера выглядит следующим образом:

auto pWebSocket = WebServer.nextPendingConnection();
QObject::connect(pWebSocket, &QWebSocket::binaryMessageReceived,
                 [&] (const QByteArray& message) { DataRead(message, rManager); });  // This slot is not called as of now

1 Ответ

0 голосов
/ 06 сентября 2018

Кажется, что нет никакого упоминания о том, как обрабатывается сигнал QWebSocket::connected().
Из-за задержки в Интернете и начальных рукопожатий, WebSocketServer может потребоваться некоторое время для установления соединения. В идеале двоичное / текстовое сообщение следует отправлять только после получения connected().

Перед установкой соединения с помощью webSocket.open(url) вы должны обработать этот сигнал:

... // same code
   QObject::connect(&webSocket, &QWebSocket::connected,
                    [&] () 
                    {
                      webSocket.sendBinaryMessage(QByteArray(message.data(), message.size()));
                      // ... set some internal state suggesting the established connection
                    }
   webSocket.open(url);

Выше приведен только псевдокод, показывающий, что первый sendBinaryMessage() должен быть отправлен после сигнала connect(). В идеале в коде реального мира вы можете захотеть установить какое-то состояние, которое информирует клиента о том, что соединение установлено.

Подобно тому, как упомянуто в комментариях, мы должны также проверять наличие ошибок и отключений.

...