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

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

有 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中没有找到这样的规定,或者我可能错过了。

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


感兴趣的 friend ,服务器[伪]代码如下:

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

最佳答案

似乎没有提到如何处理QWebSocket::connected()信号。
由于 Internet 延迟和初始握手,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() 信号之后发送。理想情况下,在现实世界的代码中,您可能想要设置一些状态,通知客户端连接已建立。

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

关于c++ - 如何从 C++ 客户端正确使用 QWebSocket::sendBinaryMessage() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52179802/

相关文章:

c++ - 链接器找不到 .so 文件

c++ - 使用 qmake 执行 shell 命令

php - 将对 Laravel Controller 的请求路由到正在运行的 WebSocket 服务器

c# - 如何使用 System.Net.HttpListener 在 WebSocket 中启用 SSL

java - 服务器端从另一个客户端获取 GET 请求时推送到客户端

c++ - 检索数字短语

c++ - 从普通数组创建 QList

c++ - 如何在 PCL 数据文件中存储/写入点云的表面法线?

c++ - Qt Creator 链接器错误 : LNK1104: cannot open file 'opencv_core249d.lib'

c++ - QWinTaskbarProgress 我做错了什么?