Привет, делаю первые шаги в Qt, столкнулся с проблемой. В общем цель - передать выбранное изображение с клиента на сервер и отобразить на сервере. Мой код работает для небольших изображений, на больших же изображениях сервер повисает. Лог пишет, что на первой итерации мы считываем, условно, 105кб из отправленных 110кб, на последующих итерациях мы не считываем вообще ничего, т.е. 0, из-за этого информация не прочитывается, и все уходит в вечный цикл и повисает.
Код отправки с клиента:
QBuffer buffer;
QImageWriter writer(&buffer, "jpg");
writer.write(m_pImage->toImage());
QByteArray barr;
QDataStream stream(&barr, QIODevice::WriteOnly);
stream << (quint32)buffer.size();
barr.append(buffer.data());
m_pTcpSocket->write(barr);
m_pTcpSocket->waitForBytesWritten(500);
Код приема и отрисовки на сервере:
QTcpSocket* pClientSocket = (QTcpSocket*)sender();
for (;;) {
if (!pClientSocket->waitForConnected(500)) continue;
if (m_nNextBlockSize == 0)
{
QDataStream stream(pClientSocket);
if (pClientSocket->bytesAvailable() < (int)sizeof(qint32))
return;
stream >> m_nNextBlockSize;
}
if (m_nNextBlockSize > pClientSocket->bytesAvailable())
return;
if (!bComplexData)
barr = pClientSocket->read(m_nNextBlockSize);
else
barr = barr.append(pClientSocket->read(m_nNextBlockSize));
pClientSocket->waitForReadyRead(500);
QBuffer buffer(&barr);
buffer.open(QIODevice::ReadOnly);
QImageReader reader(&buffer, "jpg");
QImage image = reader.read();
QLabel* plbl = new QLabel;
if (!image.isNull())
{
QPixmap pixmap = QPixmap::fromImage(image);
pixmap.save(&buffer, "jpg");
pixmap.scaled(pixmap.size() / 10,
Qt::IgnoreAspectRatio,
Qt::SmoothTransformation
);
//plbl->setText(tr("Picture w/h = ") + QString::number(pixmap.width()) + "/" + QString::number(pixmap.height()));
plbl->setPixmap(pixmap);
plbl->setFixedSize(pixmap.size());
plbl->show();
bComplexData = false;
m_nNextBlockSize = 0;
}
else
{
plbl->setText(tr("Invalid image received."));
bComplexData = true;
slotReadClient();
}
plbl->show();
layout()->addWidget(plbl);
}