QT readReady () TCPSocket нет получающего сообщения до тех пор, пока оно не понадобится

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

В момент, когда я создаю клиент-серверный проект, клиент отправляет сообщение на сервер (эта часть работает отлично), но затем сервер отправляет сообщение обратно клиенту, и именно здесь у меня начинаются проблемы, я создал отдельный класс в QT под названием Connection Management в моем клиенте, который занимается отправкой принимающих сообщений, этот класс используется моим классом Controller, который обрабатывает логику приложения всех моих страниц пользовательского интерфейса, теперь, когда мой контроллер отправляет сообщение на сервер сообщение отправлено обратно, атм у меня оно как эхо, мой класс ConnectionManagement обрабатывает поступающие сообщения с сигналом readyRead (), проблема здесь в том, что когда кто-то использует мой клиент и скажет нажать следующую кнопку, слот следующей кнопки будет вызывается и ждет до выполнения NextButtonPressed () или w / e. пока уведомления о готовности к чтению не отправлены обратно, я пытался выполнить чтение, которое можно вызвать вручную, но это не сработало?

немного моего кода:

ConnectionManager.cpp

ConnectionManager::ConnectionManager(QObject *parent)
: QTcpServer(parent)
{
socket = new QTcpSocket(this);

connect(socket, SIGNAL(readyRead()), this, SLOT(readyread()));
connect(socket, SIGNAL(disconnected()), this, SLOT(disconnect()));

socket -> connectToHost("192.168.0.119",60000);
}QString ConnectionManager::getMessage()
{
//sleep(1);
while (inMessage == "")
{
//my attempt at calling read() manually it will read nothing
QByteArray data = socket->readAll();

//just checkign what i am getting my server will immediately return a trivial
//string i.e "carly, santos, andrew, bob"std::cout << data.data() << "+ 8" << std::endl;
inMessage = data;
}
return inMessage;
}

void ConnectionManager::sendMessage(QString &message)
{
socket -> write(message.toUtf8());
}

//my socket for reading whenever something is sent?
void ConnectionManager::readyread()
{
QByteArray data = socket->readAll();
inMessage = data;
std::cout << data.data() << "+ 1" << std::endl;
}

хорошо, теперь мой controller.cpp

void Controller::openTALogin()
{
//TODO send message to Server
QString buffer = Fill::fillBufferState("Client", "TA");
//std::cout << buffer.toUtf8().data() << std::endl;
myConnection->sendMessage(buffer); // <- this works great =)

//sleep(7);
std::cout << "1234" << std::endl;

QString in = myConnection -> getMessage(); //<- gets nothing -.-

std::cout << in.toUtf8().data() << "+ 12" << std::endl;
//TODO recieve List from server
//ForNow
QLinkedList<QString> *testList = new QLinkedList<QString>();

Fill::fillLinkedList(testList, in);
//testList -> push_front("jabba:5:hut:1");
//testList -> push_front("blind:3:mice:2");
//testList -> push_front("eat:5:day:3");
//testList -> push_front("hello:4:goodbye:4");delete userWindow;
taLoginWindow = new TALoginWindow(this, testList);
taLoginWindow -> show();
testList -> clear();
delete(testList);

}

сообщение получено здесь после выполнения этой функции, я помню форму, использующую TCP / IP-соединение C-Style, чтение будет ждать, пока не будет данных, чтобы продолжить, но кажется, что это здорово, если ничего не получить здесь?

0

Решение

вы отправляете сообщение и сразу же пытаетесь получить ответ, это не сработает, потому что вам нужно вернуться в цикл обработки событий, прежде чем что-либо можно будет записать или прочитать

разделить ваш Controller::openTALogin метод в 2

void Controller::openTALogin()
{
//TODO send message to Server
QString buffer = Fill::fillBufferState("Client", "TA");
//std::cout << buffer.toUtf8().data() << std::endl;
myConnection->sendMessage(buffer); // <- this works great =)
}

void Controller::gotResponce(QString in)
{

std::cout << in.toUtf8().data() << "+ 12" << std::endl;
//TODO recieve List from server
//ForNow
QLinkedList<QString> *testList = new QLinkedList<QString>();

Fill::fillLinkedList(testList, in);
//testList -> push_front("jabba:5:hut:1");
//testList -> push_front("blind:3:mice:2");
//testList -> push_front("eat:5:day:3");
//testList -> push_front("hello:4:goodbye:4");delete userWindow;
taLoginWindow = new TALoginWindow(this, testList);
taLoginWindow -> show();
testList -> clear();
delete(testList);

}

и вторая часть вызывается в вашем readyRead:

void ConnectionManager::readyread()
{
QByteArray data = socket->readAll();
inMessage = data;
std::cout << data.data() << "+ 1" << std::endl;
emit recievedMessage(QString(inMessage)); // using signal here
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]