我正在使用带有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();
}
}
谢谢!
答案 0 :(得分:1)
您正在读取的数据包不是完整的消息。正如您自己提到的,WebSockets将数据流拆分为较小的数据包(帧)。
答案 1 :(得分:1)
AS @Kurt Pattyn说,我正在读一个不是完整信息的数据包。 我问Antoine Lafarge(QtWebsocket创始人),他确认问题出在客户端(jWebSocket)。
我是如何解决的: 我没有找到任何关于使用jWebSocket读取框架的明确信息,所以我将lib改为这个: https://github.com/koush/android-websockets
现在我正确地将我的完整图像检索为64个编码的字符串