如何从C ++客户端正确使用QWebSocket :: sendBinaryMessage()方法?

时间:2018-09-05 07:47:20

标签: c++ qt websocket client-server binary-data

有C ++ Qt客户端和服务器。以下代码可以正常工作,并且客户端与服务器之间可以建立连接:

y == 4

在发送二进制数据时,该函数返回0而不是字节数:

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"

请注意,// though the message.size() is 80 bytes; the method returns 0 webSocket.sendBinaryMessage(QByteArray(message.data(), message.size())); 可以正常工作。
我们也有一个Javascript客户端。连接并正确发送二进制消息。该客户端中唯一添加的内容如下:

QWebSocketServer

但是webSocketJS.binaryType = "arraybuffer"; // <--- Javascript code 中找不到这样的规定,否则我可能错过了。

问题:如何通过Web连接正确发送二进制数据?


对于那些感兴趣的人,服务器[pseudo]代码如下:

QWebSocket

1 个答案:

答案 0 :(得分:1)

似乎没有提及如何处理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()信号之后发送。理想情况下,在现实世界的代码中,您可能需要设置一些状态,以通知客户端已建立连接。

类似于评论中提到的,我们也应该检查错误和断开连接。