Как отправить QMap через сокет?

У меня есть объект QMap:

QMap<QString, int> map; 

и я хотел бы отправить его через сокет TCP. Мне нужно преобразовать его в JSON, а затем отправить или?


person Someone    schedule 29.05.2019    source источник
comment
вы можете сериализовать его в QByteArray   -  person Simon    schedule 29.05.2019
comment
Вам нужно отправить его через сокет TCP или просто отправить карту по сети? (Сокеты TCP имеют слишком низкий уровень для отправки данных).   -  person Dimitry Ernot    schedule 29.05.2019
comment
Мне нужно сделать что-то на стороне сервера, используя QMap (например, команду), поэтому, когда клиент вносит какие-либо изменения, в QMap это изменение выполняется и отправляется обратно клиенту, чтобы клиент мог его видеть.   -  person Someone    schedule 29.05.2019
comment
@Simon, как это сделать?   -  person Someone    schedule 29.05.2019


Ответы (1)


Попробуйте использовать такой подход:

На стороне сервера используйте это для отправки карты:

// to send Map
qint64 SendMap(QMap<String, int> map){
    QByteArray block;
    QDataStream sendStream(&block, QIODevice::ReadWrite);

    sendStream << quint64(0) // for size of data
               << map;       // your map

    sendStream.device()->seek(0); // return back to set data size

    sendStream << (quint64)(block.size() - sizeof(quint64)); // set data size

    return socket->write(block);    // send data
}

На стороне клиента, когда вы ожидаете карту, используйте это для чтения карты:

// to receive Map
QMap<QString, int> ReceiveMap(QTcpSocket *socket){
    QDataStream readStream(socket);
    quint64 dataBlockSize = 0;

    while(true) {
        if (!dataBlockSize) {
            if (socket->bytesAvailable() < sizeof(quint64)) { // waiting data size 
                break;                                        // to be available
            }
            readStream >> dataBlockSize;
        }

        if (socket->bytesAvailable() < dataBlockSize) { // waiting full data
            break;
        }

        QMap<QString, int> map;
        readStream >> map;

        return map;
    }
}
person Tom Kim    schedule 29.05.2019