LINUX.ORG.RU

QStrind to DataStrem to byte array to data streem to byte array to QString


0

1

Клиент посылает сообщение

    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out << "Hello Server";
    tcpSocket->write(block);
как бы серверу его принять?
 QByteArray data = con->readAll();
    if(!data.isEmpty()) {

        QDataStream streem(&data, QIODevice::ReadOnly);
        streem.setVersion(QDataStream::Qt_4_0);
        QString S;
        // как бы взять и из QDataStream перенести даные в S
       // stream>>S; выдаёт пустой S
        qDebug()<<S;
    }


Уверен, что в data есть данные? Посмотри сниффером или добавь в клиенте

QByteArray data = con->readAll();
qDebug("Data length: %d, data: %s", data.count(), qPrintable(data));
Chaser_Andrey ★★★★★
()
Ответ на: комментарий от Chaser_Andrey

../ServerAgain/server.cpp:125:59: ошибка: «class QByteArray» has no member named «toLocal8Bit»

Я боюсь qPrintable(data) сделать нельзя. А длинна в data = 17.

vsrmis
() автор топика
Ответ на: комментарий от vsrmis

А, блин. Там достаточно сделать так.

qDebug("Data length: %d, data: %s", data.count(), data.data());

А длинна в data = 17.

Теперь выведи ещё так в клиенте:

qDebug("Data hex: %s", data.toHex().data() );
[/code[
и на сервере перед write:

qDebug("Data hex: %s", block.toHex().data() );

Так убедимся, что данные в целостности и сохранности.

В клиенте достаточно делать так (мы ведь только читаем):

QDataStream streem(data);
Кстати, покури это: http://doc.qt.nokia.com/latest/qdatastream.html#versioning

И еще: зачем тебе такой старый формат сериализации - QDataStream::Qt_4_0?

Chaser_Andrey ★★★★★
()

connect на readyRead не забыл?

visual ★★★
()
Ответ на: комментарий от Chaser_Andrey

Заработало

Спасибо вот такой вот многоколёсный велосипед Тот кто передайт( в моём случае это клиент"

    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out <<currentFortune.toAscii();
    tcpSocket->write(block);
где QString currentFortune;

И тот кто ловит(Сервер)

    QTcpSocket * con = qobject_cast<QTcpSocket*>(sender());
    Q_ASSERT(con);
    QByteArray data = con->readAll();
    if(!data.isEmpty()) {
       QDataStream streem(data);
       streem.setVersion(QDataStream::Qt_4_0);
       streem >> data;
       QString S(data);
       emit SendText(S);
    }

А сигнал SendText ловиться в интерфейсе. Если можно сделать с меньшим количеством телодвижений ,сообщите мне.

//И еще: зачем тебе такой старый формат сериализации - QDataStream::Qt_4_0?

Так было в example. Вы считаете что он тут не нужен? Или нужен Другой?

vsrmis
() автор топика
Ответ на: Заработало от vsrmis

Завтра уже отпишу. Ты сначала подумай - тебе точно нужна сериализация данных, которую ты используешь? Ибо так ты делаешь протокол Qt-зависимым и тебе придется на альтернативных клиентах/серверах реализовывать велосипед вроде Qt-совместимого сериализатора.

И еще: зачем тебе такой старый формат сериализации - QDataStream::Qt_4_0?

Так было в example. Вы считаете что он тут не нужен? Или нужен Другой?

В приведенной выше ссылке описаны доступные форматы сериализации. ИМХО, нет смысла без веских причин использовать старые форматы, если доступны более новые. Разве что обратная совместимость. Ну ты же не на Qt 4.1 делаешь.

Chaser_Andrey ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.