Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > пересылка данных по сети [Qt]


Автор: ss 21.10.2014, 19:58
Здравствуйте. Есть клиент и сервер 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");
}




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)