QtWebsocket / JWebsocket大数据问题

时间:2014-02-05 10:01:14

标签: android c++ qt websocket

我正在使用带有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();
}

}

谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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