crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Получение данных на сервере?
V7T
  опции профиля:
сообщение 21.10.2011, 16:08
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 11.10.2011
Пользователь №: 2939

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте, пишу клиент/серверное приложение, я использую FortuneClient и ThreadedFortuneServer из SDK QT.

Все бы ничего, но ни как не могу понять (это первое мое приложение в QT и собственно в линуксе), принцип получения данных на сервере.
В самих примерах все достаточно просто, но там данные отправляются клиенту, который их принимает, перед этим отправив запрос.

Собственно вот часть кода клиента:
void Client::requestNewFortune()
{
    //getFortuneButton->setEnabled(false);
    blockSize = 0;
    tcpSocket->abort();

    tcpSocket->connectToHost(hostLineEdit->text(),
                             portLineEdit->text().toInt());

    QPixmap screenshot = QPixmap::grabWindow(QApplication::desktop()->winId());
    QByteArray foto;
    QBuffer buffer(&foto);
    buffer.open(QIODevice::WriteOnly);
    screenshot.save(&buffer,"jpg");

    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out << (quint16)0;
    out<<buffer.data();//отправяем данные скриншота
    out.device()->seek(0);
    out << (quint16)(block.size() - sizeof(quint16));

    qDebug()<<"Size of buffer: "<<buffer.size();//число...
    qDebug()<<"Size of block: "<<block.size();//число...
    
    qDebug()<< tcpSocket->write(block);

    tcpSocket->disconnectFromHost();
    tcpSocket->waitForDisconnected();



часть кода сервера:
void FortuneThread::run()
{
    QTcpSocket tcpSocket;
    if (!tcpSocket.setSocketDescriptor(socketDescriptor))//работаем с дескриптором
    {
        emit error(tcpSocket.error());
        return;
    }


    QDataStream in(&tcpSocket);//здесь без взятия адреса ругается
    in.setVersion(QDataStream::Qt_4_0);

    QByteArray buffer;
    in >> buffer;

    qDebug()<<buffer.size();
    qDebug()<<tcpSocket.bytesAvailable();

    tcpSocket.disconnectFromHost();
    //tcpSocket.waitForDisconnected();
}


В коде сервера явно не все впорядке (возможно и клиенте) :) , и Вас уважаемые гуру наверно :bad: .

Правильно ли данные отправляются?
Может стоит создать connect(сокет,сигнал(readyRead()),...,slot(..)), впринципе, что я только не делал, все одно - ничего)).
Не первый день пытаюсь разобраться, окончательно запутался.

Подскажите, пожалуйста.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
silver47
  опции профиля:
сообщение 24.10.2011, 9:55
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


А класс SendImage обязательно должен быть таким запутанным. Может просто послать эту картинку и всего делов?
Кроме того, насколько мне известно, кажется, что, оператор << перегружен для QImage. Если это так, то в этом шаманстве:
QByteArray ba;
QBuffer buffer(&ba);
image.save(&buffer, "PNG");
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << ba;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
нет смысла. Достаточно напрямую записать в поток и все:
ByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
out << quint16(0) << QImage;
out.device()->seek(0);
out << quint16(block.size() - sizeof(quint16));
socket->write(block);


Пы.Сы. А Вы уверенны, что картинка будет точно размером меньше 65килобайт?

Сообщение отредактировал silver47 - 24.10.2011, 10:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
V7T
  опции профиля:
сообщение 25.10.2011, 0:13
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 11.10.2011
Пользователь №: 2939

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(silver47 @ 24.10.2011, 10:55) *
А класс SendImage обязательно должен быть таким запутанным. Может просто послать эту картинку и всего делов?

Пы.Сы. А Вы уверенны, что картинка будет точно размером меньше 65килобайт?



...хм, например, в дебагер размер Image вывожу, получаю около 200000 (размер байтового массива QByteArray), т.е., не хочу сморозить глупость, но как я понимаю это 200000 байт, следовательно изображение занимает около 200 кбайт. На сервере я спокойно их получаю. Получается, что все сообщение, в данном случае, разобьется на 4 блока.

...кстати да, убрал полностью класс SendImage, решил не заморачиваться с ним.

Что касается прямого запихивания QImage в QDataStream,
out<<image (альтернатива out<<(&out,&image) как то так, ) запихивается на ура, но на сервере QDataStream взяв сокет не хочет выводить данные в image напрямую (ошибок не наблюдается), т.е. сокет не пустой (сколько отправлено, столько и пришло).

все как в документации.
QDataStream &    operator<< ( QDataStream & stream, const QImage & image )
QDataStream &    operator>> ( QDataStream & stream, QImage & image )


А теперь самое интересное, неоднократно натыкался в интернете, на одну особенность или может быть в силу таких же кривых рук.
Если передавать изображение так:
    QByteArray ba;
    QBuffer buffer(&ba);
    image.save(&buffer,"PNG");

т.е. сохранить изображение в массив байтовый в формате PNG, на сервере тоже принимать в PNG (image.loadFromData(Block,"PNG");, то все работает замечательно. Но стоит поменять формат загрузки/разгрузки в/из байтового массива, например JPG, BMP то при получении на сервере (in>>Block, image.loadFromData(Block,"...")) c последующей проверкой image.isNull() - постое, по нулям, хотя поток блоковый заполнен. В результате, если отправлять/принимать только в PNG, то сохранять придется тоже в PNG (image.save(..."PNG")), в другом формате не получается, следовательно изображение будет занимать 3 метра. А это не выгодно, хотя мне для учебы не принципиально.

Решение есть, если я отправляю просто pixmap, перед этим загнанный в массив, на сервере потом могу сохранять в любом формате, при этом экономя место.





Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 13.11.2024, 0:57