代码之家  ›  专栏  ›  技术社区  ›  iammilind

如何正确使用C++客户端的QWebStuts:sDunBAREYMISEAGE()方法?

  •  1
  • iammilind  · 技术社区  · 8 年前

    有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 或者我可能错过了。

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


    对于感兴趣的人,服务器[伪]代码如下所示:

    auto pWebSocket = WebServer.nextPendingConnection();
    QObject::connect(pWebSocket, &QWebSocket::binaryMessageReceived,
                     [&] (const QByteArray& message) { DataRead(message, rManager); });  // This slot is not called as of now
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Swapnil Bret Hogg    8 年前

    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()

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