c++ - 如何从 C++ 客户端正确使用 QWebSocket::sendBinaryMessage() 方法?
问题描述
有 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
解决方案
似乎没有提及如何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()
信号之后发送。理想情况下,在现实世界的代码中,您可能希望设置一些状态,通知客户端连接已建立。
与评论中提到的类似,我们也应该检查错误和断开连接。
推荐阅读
- android - Android Studio 将新文件从 kotlin 移动到 java 包中
- ms-access - 如何以 Ms.Access 查询为条件选择 COUNT(DISTINCT) 和 WHERE
- python - 如何将一列添加到从 0 开始直到数组长度的 numpy 数组?
- python - 使用 PyOpenGL 为不同的对象添加不同的纹理
- python-3.x - 每次迭代都会更改一个变量,我想将它作为键打印到字典中
- c++ - 在 C++ 中暂停 For-Loop 1 秒
- javascript - 不允许在字符串中的任何位置使用 '.'(dot)(正则表达式)
- javascript - 未捕获的类型错误:无法读取 HTMLButtonElement.removeItem 处未定义的属性“已检查”(script.js:26)
- c# - 在动作中的 MVC Controller 中将 bool 状态更改并保存为 true
- c# - 在运行时更改 asp.net 核心模型属性名称