Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Aftor от Август 01, 2011, 11:27



Название: Клиент-Серверная связка
Отправлено: Aftor от Август 01, 2011, 11:27
Добрый день
Есть два приложения, написаных на qt, подскажите как можно из одного приложения (серверного) управлять другим приложением (клиентским). под управлять я иммею ввиду выполнение слотов клиентского приложения на сигнал серверного.
Буду благодарен за полезные ссылки, описание методов решения проблемы и др.


Название: Re: Клиент-Серверная связка
Отправлено: Пантер от Август 01, 2011, 11:32
Соединяй их через сокет.
Посмотри Fortune Server Example.


Название: Re: Клиент-Серверная связка
Отправлено: kuzulis от Август 01, 2011, 11:45
ТС, поиск по форуму и в гугле рулит!


Название: Re: Клиент-Серверная связка
Отправлено: Aftor от Август 01, 2011, 11:51
подкиньте ссылочек на рускоязычные ресурсы.
Документация по Fortune Server Example в гугле ток на инглише.


Название: Re: Клиент-Серверная связка
Отправлено: Aftor от Август 02, 2011, 11:34
Попробовал разобраться с Fortune Server - Fortune Client.
Ток основного по ходу так и не понял. как происходит передача fortunes из сервера в строку nextFortune клиенту?

Не могли бы вы помочь со следующими функциями?

Код
C++ (Qt)
void Server::sendFortune() (server.cpp)
{
   QByteArray block;
   QDataStream out(&block, QIODevice::WriteOnly);
   out.setVersion(QDataStream::Qt_4_0);
   out << (quint16)0;
   out << fortunes.at(qrand() % fortunes.size());
   out.device()->seek(0);
   out << (quint16)(block.size() - sizeof(quint16));
 
   QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
   connect(clientConnection, SIGNAL(disconnected()),
           clientConnection, SLOT(deleteLater()));
 
   clientConnection->write(block);
   clientConnection->disconnectFromHost();
}
 
...
 
void Client::readFortune() (client.cpp)
{
   QDataStream in(tcpSocket);
   in.setVersion(QDataStream::Qt_4_0);
 
   if (blockSize == 0) {
       if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
           return;
 
       in >> blockSize;
   }
 
   if (tcpSocket->bytesAvailable() < blockSize)
       return;
 
   QString nextFortune;
   in >> nextFortune;
 
   if (nextFortune == currentFortune) {
       QTimer::singleShot(0, this, SLOT(requestNewFortune()));
       return;
   }
 
   currentFortune = nextFortune;
   statusLabel->setText(currentFortune);
   getFortuneButton->setEnabled(true);
}
 

И как по аналогии с этим можно через два потока в разных приложениях связать сигнал одного приложения со слотом другого?


Название: Re: Клиент-Серверная связка
Отправлено: Странник от Август 02, 2011, 12:04
Добрый день
Есть два приложения, написаных на qt, подскажите как можно из одного приложения (серверного) управлять другим приложением (клиентским). под управлять я иммею ввиду выполнение слотов клиентского приложения на сигнал серверного.
Буду благодарен за полезные ссылки, описание методов решения проблемы и др.
можно использовать D-Bus (http://ru.wikipedia.org/wiki/D-Bus), в примерах dbus посмотри.
но на сокетах универсальнее, подходящий под это дело пример local fortune лежит в папке ipc.


Название: Re: Клиент-Серверная связка
Отправлено: Fess от Август 02, 2011, 12:15
Посмотрите на вот это решение:
http://libqxt.bitbucket.org/doc/tip/qxtrpcpeer.html


Название: Re: Клиент-Серверная связка
Отправлено: Aftor от Август 02, 2011, 13:05
Как я понял механизм работы приложений Fortune server и Fortune client на doc.qt.nokia.com:
С клиентского приложения идет коннект к серверу
На серверно приложении выполняется слот sendFortune() после

connect(server, SIGNAL(newConnection()), this, SLOT(sendFortune()));

В sendFortune() создается поток "out" В который записываются некоторые данные

В клиентском приложении после коннекта к серверу вызывается readFortune(), где создается поток "in" в который каким-то образом передаются данные из потока "out" и благополучно меняется строка состояния на ту, что пришла от клиента.

Правильно ли я понял как это работает?
Каким образом передаются данные из одного потока в другой?
И как я могу соеденить сигнал с сервера и слот клиента?


Название: Re: Клиент-Серверная связка
Отправлено: Странник от Август 02, 2011, 13:31
Как я понял механизм работы приложений Fortune server и Fortune client на doc.qt.nokia.com:
С клиентского приложения идет коннект к серверу
На серверно приложении выполняется слот sendFortune() после

connect(server, SIGNAL(newConnection()), this, SLOT(sendFortune()));

В sendFortune() создается поток "out" В который записываются некоторые данные

В клиентском приложении после коннекта к серверу вызывается readFortune(), где создается поток "in" в который каким-то образом передаются данные из потока "out" и благополучно меняется строка состояния на ту, что пришла от клиента.

Правильно ли я понял как это работает?
Каким образом передаются данные из одного потока в другой?
И как я могу соеденить сигнал с сервера и слот клиента?
в общем верно, данные передаются через сокет. сигнал и слот таким образом не соединить, можно реализовать обмен сообщениями, а остальное дописывать уже самостоятельно.

если аналог сигнал-слотового соединения нужен из коробки - DBus или предложеный выше QxtRpcPeer.


Название: Re: Клиент-Серверная связка
Отправлено: Aftor от Август 02, 2011, 13:47
То есть я могу сделать структуру следующей:
Нужный мне сигнал в приложении сервера соединяю с аналогом функции sendFortune (посылаю сообщение)
В приложении клиенте к сигналу сокета readyRead присоединяю аналог функции readFortune в которой анализирую пришедшее сообщение и делаю в соответствии с этим emit нужного мне сигнала у клиента?

Еще вопрос на какие действия у tcpServer генерируется сигнал readyRead у tcpSocket?


Название: Re: Клиент-Серверная связка
Отправлено: Fess от Август 02, 2011, 13:56
То есть я могу сделать структуру следующей:
Нужный мне сигнал в приложении сервера соединяю с аналогом функции sendFortune (посылаю сообщение)
В приложении клиенте к сигналу сокета readyRead присоединяю аналог функции readFortune в которой анализирую пришедшее сообщение и делаю в соответствии с этим emit нужного мне сигнала у клиента?
Примерно так, только в Qxt это все уже сделано за вас..
Еще вопрос на какие действия у tcpServer генерируется сигнал readyRead у tcpSocket?
http://doc.qt.nokia.com/latest/qiodevice.html#readyRead


Название: Re: Клиент-Серверная связка
Отправлено: Aftor от Август 02, 2011, 14:00
Цитировать
Примерно так, только в Qxt это все уже сделано за вас..
Что такое Qxt и где я могу про это почитать?


Название: Re: Клиент-Серверная связка
Отправлено: TaIRou от Август 02, 2011, 14:28
Цитировать
Примерно так, только в Qxt это все уже сделано за вас..
Что такое Qxt и где я могу про это почитать?

привет!
Посмотрите на вот это решение:
http://libqxt.bitbucket.org/doc/tip/qxtrpcpeer.html