Qt C++ Задежка при отправке и получения запросов

Возникла такая проблема: Не могу сделать задержку при записи и считывании данных через QTcpSocket.

Есть Клиент и Сервер. Необходимо сделать обмен данными:

  1. Клиент отправляет "Hello";
  2. Сервер получает данные ("Hello") и выводит их через QDebug();
  3. Сервер отправляет сообщение Клиенту: "Hello too";
  4. Клиент получает данные ("Hello too") и выводит их через QDebug(); И таких 3 (а может и больше) итерации (только с разными сообщениями) :)

Если использовать тупо:

  1. pTcpSocket->write("Hello"); - Клиент
  2. pTcpSocket->readAll("Hello"); - Сервер
  3. pTcpSocket->write("Hello too"); - Сервер
  4. pTcpSocket->readAll("Hello too"); - Клиент

То к сожалению, ничего не получается. То Сервер считывает пустую строку, то Клиент.... или вообще все смешивается. :(

Через:

 QTimer *timer = new QTimer();
 connect(timer, SIGNAL(timeout()), this, SLOT(slotSendToServer()));
 timer->start(1000);

Работает адекватно, но я не могу отправлять разные сообщения (если только через какие-нибудь извилистые костыли). Думал через функции Sleep(msec), но и так не работает; Прошу Вас, подскажите, пожалуйста, что можно придумать? Как решить эту проблему?


Ответы (1 шт):

Автор решения: magrif

Создайте два приложения, подключите модуль network и последний стандарт C++

QT += network
CONFIG += c++latest

В функции main сервера:

QTcpServer serv;
if(Q_UNLIKELY(!serv.listen(QHostAddress::Any, 10050))) {
    qFatal("Выбери другой порт");
}
QObject::connect(&serv, &QTcpServer::newConnection, [&serv]{
    QTcpSocket* client { serv.nextPendingConnection() };
    QObject::connect(client, &QTcpSocket::readyRead, [client] {
        QString msg { client->readAll() };
        qInfo() << "Клиент:" <<  msg;
        if(msg == "Привет") {
            client->write("Да, алё");
        }
        else if(msg == "Ну как там с деньгами") {
            client->write("Какими деньгами");
        }
        else if(msg == "Ну которые я внес в капитал") {
            client->write("Куда?");
        }
        else if(msg == "В капитал прожиточного минимума") {
            client->write("Ты пьяный или кто, сынок");
        }
        else if(msg == "Я Михал Палыч Терентьев") {
            client->write("Кто такой");
        }
        else if(msg == "Кто такой") {
            client->write("Пьяный");
        }
        else if(msg == "Пьяный") {
            client->write("Вот именно, ну и все, завяжи лямку");
            client->close();
        }
        client->waitForBytesWritten();
    });
});

В функции main клиента:

QTcpSocket client;
QObject::connect(&client, &QTcpSocket::readyRead, [&client]{
    QString msg { client.readAll() };
    qInfo() << "Сервер:" << msg;
    if(msg == "Да, алё") {
        client.write("Ну как там с деньгами");
    }
    else if(msg == "Какими деньгами") {
        client.write("Ну которые я внес в капитал");
    }
    else if(msg == "Куда?") {
        client.write("В капитал прожиточного минимума");
    }
    else if(msg == "Ты пьяный или кто, сынок") {
        client.write("Я Михал Палыч Терентьев");
    }
    else if(msg == "Кто такой") {
        client.write("Пьяный");
    }
    client.waitForBytesWritten();
});
client.connectToHost("localhost", 10050);
if( Q_UNLIKELY(!client.waitForConnected())) {
    qFatal("Не дозвонился");
}
client.write("Привет");

Обратите внимание на waitForBytesWritten(), которая блокирует выход из функции до завершения записи сообщения в сокет. Более развернутый пример тут

→ Ссылка