Это домашняя работа, так что некоторые концептуальные советы будут хороши.
В момент, когда я создаю клиент-серверный проект, клиент отправляет сообщение на сервер (эта часть работает отлично), но затем сервер отправляет сообщение обратно клиенту, и именно здесь у меня начинаются проблемы, я создал отдельный класс в 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, чтение будет ждать, пока не будет данных, чтобы продолжить, но кажется, что это здорово, если ничего не получить здесь?
вы отправляете сообщение и сразу же пытаетесь получить ответ, это не сработает, потому что вам нужно вернуться в цикл обработки событий, прежде чем что-либо можно будет записать или прочитать
разделить ваш 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
}
Других решений пока нет …