Здравствуйте. Есть клиент и сервер TCP (взял из http://qt-doc.ru/realizacia-servera-s-pomoschu-klassa-qtcpserver.html). Хочу переслать ,по мимо, даты и строки еще и рисунок (есть пример http://www.cyberforum.ru/qt/thread748279.html сообщение 29.12.2012, 21:13). В клиенте загружаем рисунок из файла, передаем серверу и сервер сохраняет на диск в файл. В готов примере клиент отсылает дату и строку. Сервер получает эти данные выводит себе на форму формирует ответ дата + строка и отсылает клиенту. Сам пример работает нормально. Рисунок не сохраняется (может даже и не передается). Когда я добавляю код пересылки рисунка то первый раз происходит обмен данными между клиентом и сервером нормально а второй раз уже клиент ничего не получает от сервера.
клиент
| Код | QPixmap* m_pViewScreen; //quint32 m_nNextBlockSize; описано в классе
void MyClient::slotSendToServer() { //m_pViewScreen - загружается в конструкторе клиента
QByteArray arrBlock; QDataStream out(&arrBlock, QIODevice::WriteOnly);
QBuffer buffer; QImageWriter writer(&buffer, "png");
out.setVersion(QDataStream::Qt_4_7);
writer.write(m_pViewScreen->toImage());
out << quint32(0) << QTime::currentTime() << m_ptxtInput->text() <<(quint32)buffer.size() <<buffer.data();
out.device()->seek(0); out << quint32(arrBlock.size() - sizeof(quint32));
m_pTcpSocket->write(arrBlock); m_ptxtInput->setText(""); }
|
сервер
| Код | QImage* m_pViewScreen; //quint32 m_nNextBlockSize; описано в классе
void MyServer::slotReadClient() { qDebug()<<"read from client"; QTcpSocket* pClientSocket = (QTcpSocket*)sender(); QDataStream in(pClientSocket); in.setVersion(QDataStream::Qt_4_7); for (;;) { if (!m_nNextBlockSize) { if (pClientSocket->bytesAvailable() < sizeof(quint32)) { break; } in >> m_nNextBlockSize; }
if (pClientSocket->bytesAvailable() < m_nNextBlockSize) { break; } QTime time; QString str;
qint32 nSizeImage; QByteArray barr;
in >> time >> str >> nSizeImage;// >> barr;
barr = pClientSocket->read(nSizeImage);
QBuffer buffer(&barr);
QImageReader reader(&buffer, "png"); *m_pViewScreen = reader.read();
QString strMessage = time.toString() + " " + "Client has sent - " + str; m_ptxt->append(strMessage);
m_nNextBlockSize = 0;
sendToClient(pClientSocket, "Server Response: Received \"" + str + "\"" ); }
m_pViewScreen->save("d:/q/primer.png","png"); }
|
|