Отправка данных с сервера клиенту

У меня есть два проекта, один для сервера и один для клиента. На клиенте, когда я хочу отправить данные, я создаю переменную-член QTcpSocket, а затем отправляю данные с помощью метода write().

На сервере я получаю информацию, но хочу отправить информацию обратно клиенту. В частности, я пытаюсь проверить пользователя, поэтому я отправляю имя пользователя и пароль, с которыми они входят в систему на клиенте, на сервер, и я хочу проверить эти данные в базе данных, сохраненной на сервере, а затем отправить информацию обратно клиенту для проверки правильности информации.

Моя проблема в том, что я не знаю, как отправить информацию с сервера на клиент. На сервере у меня есть две переменные-члены, QTcpServer server; и QTcpSocket* client;.

Я просмотрел документацию по QTcpServer, и насколько мне известно, у него нет эквивалента write(), а QTcpSocket* — это клиент, который в данный момент подключен к серверу.

Я думал о создании переменной QTcpSocket на сервере и отправке информации клиенту так же, как я отправляю информацию на сервер, но это кажется неправильным, потому что тогда клиент будет вести себя как сервер с переменной QTcpServer на клиенте. .

Как еще я мог бы сделать это?


person Lighthat    schedule 16.07.2014    source источник


Ответы (1)


Вы должны использовать QTcpServer для приема входящих TCP-соединений. Сначала вызовите listen(), чтобы дождаться соединения:

QTcpServer* tcpServer = new QTcpServer();

connect(tcpServer, SIGNAL(newConnection()), this, SLOT(onNewConnection()));

if( !tcpServer->listen( QHostAddress::Any, port_no ) )
    qDebug() << "Couldn't listen to port";

Этот сигнал newConnection выдается каждый раз, когда доступно новое соединение. Итак, мы подключаем сигнал к слоту, чтобы заставить объект сервера QTcpSocket общаться с клиентом:

void MyClass::onNewConnection()
{
    serverSocket = tcpServer->nextPendingConnection();

    connect(serverSocket, SIGNAL(readyRead()), this, SLOT(readSocket()));
}

Теперь вы можете отправлять данные в клиентский сокет, используя метод write:

serverSocket->write("Hello!");

И читать данные, когда приходят новые данные:

void MyClass::readSocket()
{
    QByteArray data = serverSocket->readAll();
    ...
}
person Nejat    schedule 17.07.2014
comment
Как только я пишу данные, используя serverSocket->write("Hello!");, как мне их прочитать на этом клиенте? С функцией readSocket, которую я включаю в свою клиентскую программу? Я уже могу читать данные, отправленные с клиента на сервер, поэтому я предполагаю, что вы хотите, чтобы я поместил функцию readSocket именно туда. - person Lighthat; 17.07.2014
comment
Чтение данных на стороне клиента аналогично. Просто подключите сигнал readyRead клиентского сокета к какому-то слоту. При поступлении новых данных излучается сигнал, вызывается слот, и вы можете читать данные оттуда. - person Nejat; 17.07.2014
comment
Я добавил в свою клиентскую программу две переменные: QTcpSocket* incomingFromServer; для обработки данных, поступающих с сервера и сервера QTcpServer*; для прослушивания входящего соединения с сервера. У меня есть функция приветствия для отправки сообщения на сервер каждый раз, когда пользователь открывает клиентскую программу, и чтобы проверить это, я хочу получить сообщение с сервера. Поэтому после того, как я вызываю запись на клиенте, я вызываю соединение, а затем жду ответа на этом порту, точно так же, как я делаю на сервере, когда жду ответа от клиента. Пока это правильно? - person Lighthat; 17.07.2014
comment
Это неправильно. Вы должны иметь только QTcpSocket на стороне клиента и подключаться только к IP-адресу сервера, который прослушивает сервер порта. QTcpServer предназначен только для серверной части. Сервер прослушивает определенный порт, и клиент подключается к нему. Так что на стороне клиента просто подключитесь к порту сервера и ip. - person Nejat; 17.07.2014
comment
Итак, как мне заставить клиента ждать ответа от сервера? Нужно ли помещать connect(&client, SIGNAL(readyRead()), this, SLOT(someSlot())); в конструктор объекта Client? Мне вообще не нужно listen? - person Lighthat; 18.07.2014
comment
Кажется, это ответ. Я только что сделал это, и он отлично работает. Большое спасибо! - person Lighthat; 18.07.2014