Qt C++ Задежка при отправке и получения запросов
Возникла такая проблема: Не могу сделать задержку при записи и считывании данных через QTcpSocket.
Есть Клиент и Сервер. Необходимо сделать обмен данными:
- Клиент отправляет "Hello";
- Сервер получает данные ("Hello") и выводит их через QDebug();
- Сервер отправляет сообщение Клиенту: "Hello too";
- Клиент получает данные ("Hello too") и выводит их через QDebug(); И таких 3 (а может и больше) итерации (только с разными сообщениями) :)
Если использовать тупо:
- pTcpSocket->write("Hello"); - Клиент
- pTcpSocket->readAll("Hello"); - Сервер
- pTcpSocket->write("Hello too"); - Сервер
- pTcpSocket->readAll("Hello too"); - Клиент
То к сожалению, ничего не получается. То Сервер считывает пустую строку, то Клиент.... или вообще все смешивается. :(
Через:
QTimer *timer = new QTimer();
connect(timer, SIGNAL(timeout()), this, SLOT(slotSendToServer()));
timer->start(1000);
Работает адекватно, но я не могу отправлять разные сообщения (если только через какие-нибудь извилистые костыли). Думал через функции Sleep(msec), но и так не работает; Прошу Вас, подскажите, пожалуйста, что можно придумать? Как решить эту проблему?
Ответы (1 шт):
Создайте два приложения, подключите модуль 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(), которая блокирует выход из функции до завершения записи сообщения в сокет.
Более развернутый пример тут