Russian Qt Forum
Апрель 19, 2024, 18:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с передачей данных в клиент-сервере  (Прочитано 1780 раз)
stochastic
Новичок

Offline Offline

Сообщений: 6


Просмотр профиля
« : Февраль 12, 2023, 01:36 »

Привет, делаю первые шаги в 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);
    }
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Февраль 12, 2023, 11:27 »

может за 500мс в m_pTcpSocket->waitForBytesWritten(500) просто все данные не успевают уйти? а проблемную ситуацию, конечно, надо обрабатывать на сервере, чтоб он не зависал.

по клиент-серверному взаимодействию еще можно рассмотреть пример https://wiki.qt.io/WIP-How_to_create_a_simple_chat_application
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
stochastic
Новичок

Offline Offline

Сообщений: 6


Просмотр профиля
« Ответ #2 : Февраль 12, 2023, 13:02 »

Я пробовал и по дефолту (30000 мс) ставить, результат тот же, просто ждем больше. На сервере я вынес QByteArray в класс и пытаюсь в цикле набить его всей информацией из сокета, но видимо что-то не так в моем понимании приема информации. В примере используется JSON, я с ним пробовал писать и проблем не было, а вот как корректно медиа передать пока не понял.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #3 : Февраль 12, 2023, 13:34 »

самое простое для начала — добавить qDebug() для вывода в разные части приема на сервере для большего понимания что там происходит внутри (ну или точки останова через отладчик).

тип передаваемых данных значения не имеет: это ж всего лишь байты. думаю, если ты передашь жсон на 200 КБ будет та же проблема.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
stochastic
Новичок

Offline Offline

Сообщений: 6


Просмотр профиля
« Ответ #4 : Февраль 13, 2023, 01:32 »

Да, вы правы заметив на счет количества отправляемых данных. Решил все проблемы переписав способ сериализации, в нативных плюсах как-то немного попроще с этим.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #5 : Февраль 13, 2023, 10:52 »

было бы неплохо выложить решение Улыбающийся вдруг кому поможет в будущем
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 22.