【问题标题】:QtWebsocket / JWebsocket large data issueQtWebsocket / JWebsocket 大数据问题
【发布时间】:2014-02-05 10:01:13
【问题描述】:

我正在使用带有 QtWebsocket 服务器的 c++ 应用程序和 Android 应用程序上的 JWebsocket 客户端。

当我发送一个大字符串(png 文件为基于 64 位的字符串)时,我只收到 1400 个字符,你知道为什么吗?

也许我错过了一些东西,我读到我可以发送大数据,因为 websocket 实现在内部拆分了它们。 所以也许我错过了客户端中的某些内容..

服务器端:

void WebSocketServer::sendImage(cv::Mat image)
{
    QtWebsocket::QWsSocket* client;
    uchar* datas = image.data;
    std::cout << image.cols * image.rows << std::endl;
    std::cout << "coucou" << std::endl;
    QString dataString;
    for (int i = 0; i < (image.cols * image.rows ) - 2 ; i++)
    {
        dataString += datas[i];

    }
    qDebug() << dataString;
    std::cout << "Sending an image" << std::endl;
    cv::Mat dst;
    cv::cvtColor(image, dst, CV_BGR2RGB);
    QImage imageAsQImage((uchar*)dst.data, dst.cols, dst.rows, QImage::Format_RGB32);


    QString encodedImage = encodeToBase64(imageAsQImage);

    foreach(client, clients)
    {
        client->write(encodedImage);
        //client->write(dataString);
    }
}

客户端:

public class WebSocketClient extends AsyncTask<String, Integer, Long> implements WebSocketClientTokenListener{

private BaseTokenClient btc;


public WebSocketClient() {
System.out.println("Creating a new websocket client");
btc = new BaseTokenClient();
btc.addListener(this);
btc.addListener(new RpcListener());
Rpc.setDefaultBaseTokenClient(btc);
Rrpc.setDefaultBaseTokenClient(btc);
}
...

    @Override
public void processPacket(WebSocketClientEvent arg0, WebSocketPacket arg1) {
if(arg0.getClient().getNegotiatedEncoding() == WebSocketEncoding.TEXT)
{
    // here is only the first 1400 chars...
    String response = arg1.getASCII();
}

}

谢谢!

【问题讨论】:

    标签: android c++ qt websocket


    【解决方案1】:

    您正在读取的数据包不是完整的消息。正如您自己提到的,WebSockets 将数据流拆分为更小的数据包(帧)。

    【讨论】:

    • 这是否意味着数据包应该包含所有帧? (我应该找到一种迭代它们的方法)或者我应该接收多个数据包? (我只收到一个)jwebsocket 文档对我来说似乎很奇怪.. 谢谢
    【解决方案2】:

    正如@Kurt Pattyn 所说,我正在阅读一个不是完整消息的数据包。 我询问了 Antoine Lafarge(QtWebsocket 创始人),他确认问题出在客户端(jWebSocket)上。

    我是如何解决的: 我没有找到任何关于使用 jWebSocket 读取帧的明确信息,所以我将 lib 更改为这个: https://github.com/koush/android-websockets

    现在我正确地将我的完整图像检索为 64 编码字符串

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      • 2023-03-18
      • 2021-06-09
      • 2018-10-18
      相关资源
      最近更新 更多