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

Posted

技术标签:

【中文标题】如何从 C++ 客户端正确使用 QWebSocket::sendBinaryMessage() 方法?【英文标题】:How to properly use QWebSocket::sendBinaryMessage() method from a C++ client? 【发布时间】:2018-09-05 07:47:19 【问题描述】:

有 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::errorQWebSocket::errorString 等返回的值? 还要检查QWebSocket::closeReason(),可能是socket关闭了,因为如果sendBinaryMessage返回0,说明没有数据发送。 @G.M.,是的,我已经检查过了,他们似乎不是问题制造者。对 ManuelH 来说,是的,这很重要。我必须检查一下。 ——总的来说,我似乎找到了根本原因。我没有检查connected() 信号。代码运行速度太快,无法等待此信号发出。 【参考方案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() 信号之后发送。理想情况下,在现实世界的代码中,您可能希望设置一些状态,通知客户端连接已建立。

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

【讨论】:

以上是关于如何从 C++ 客户端正确使用 QWebSocket::sendBinaryMessage() 方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用带有 C++ 的 tensorflow 从 YOLO 模型中获取输出?

C++,如何从字符串中获取正确的双精度值?

如何在 C++ 中正确使用命名空间?

如何从 SWIG 中获取正确的错误,并在 Python 中不正确地重载 C++ 虚函数

如何使用 ZeroMQ 从 C# 客户端向 C++ 服务器发送消息

如何使用 C++ 在 Winsock 中将大字符串从客户端发送到服务器