Russian Qt Forum
Май 06, 2024, 09:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Клиент-Серверная связка  (Прочитано 5825 раз)
Aftor
Гость
« : Август 01, 2011, 11:27 »

Добрый день
Есть два приложения, написаных на qt, подскажите как можно из одного приложения (серверного) управлять другим приложением (клиентским). под управлять я иммею ввиду выполнение слотов клиентского приложения на сигнал серверного.
Буду благодарен за полезные ссылки, описание методов решения проблемы и др.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 01, 2011, 11:32 »

Соединяй их через сокет.
Посмотри Fortune Server Example.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Август 01, 2011, 11:45 »

ТС, поиск по форуму и в гугле рулит!
Записан

ArchLinux x86_64 / Win10 64 bit
Aftor
Гость
« Ответ #3 : Август 01, 2011, 11:51 »

подкиньте ссылочек на рускоязычные ресурсы.
Документация по Fortune Server Example в гугле ток на инглише.
Записан
Aftor
Гость
« Ответ #4 : Август 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);
}
 

И как по аналогии с этим можно через два потока в разных приложениях связать сигнал одного приложения со слотом другого?
Записан
Странник
Гость
« Ответ #5 : Август 02, 2011, 12:04 »

Добрый день
Есть два приложения, написаных на qt, подскажите как можно из одного приложения (серверного) управлять другим приложением (клиентским). под управлять я иммею ввиду выполнение слотов клиентского приложения на сигнал серверного.
Буду благодарен за полезные ссылки, описание методов решения проблемы и др.
можно использовать D-Bus, в примерах dbus посмотри.
но на сокетах универсальнее, подходящий под это дело пример local fortune лежит в папке ipc.
Записан
Fess
Гость
« Ответ #6 : Август 02, 2011, 12:15 »

Посмотрите на вот это решение:
http://libqxt.bitbucket.org/doc/tip/qxtrpcpeer.html
Записан
Aftor
Гость
« Ответ #7 : Август 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" и благополучно меняется строка состояния на ту, что пришла от клиента.

Правильно ли я понял как это работает?
Каким образом передаются данные из одного потока в другой?
И как я могу соеденить сигнал с сервера и слот клиента?
Записан
Странник
Гость
« Ответ #8 : Август 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.
Записан
Aftor
Гость
« Ответ #9 : Август 02, 2011, 13:47 »

То есть я могу сделать структуру следующей:
Нужный мне сигнал в приложении сервера соединяю с аналогом функции sendFortune (посылаю сообщение)
В приложении клиенте к сигналу сокета readyRead присоединяю аналог функции readFortune в которой анализирую пришедшее сообщение и делаю в соответствии с этим emit нужного мне сигнала у клиента?

Еще вопрос на какие действия у tcpServer генерируется сигнал readyRead у tcpSocket?
Записан
Fess
Гость
« Ответ #10 : Август 02, 2011, 13:56 »

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

Цитировать
Примерно так, только в Qxt это все уже сделано за вас..
Что такое Qxt и где я могу про это почитать?
Записан
TaIRou
Гость
« Ответ #12 : Август 02, 2011, 14:28 »

Цитировать
Примерно так, только в Qxt это все уже сделано за вас..
Что такое Qxt и где я могу про это почитать?

привет!
Посмотрите на вот это решение:
http://libqxt.bitbucket.org/doc/tip/qxtrpcpeer.html
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.076 секунд. Запросов: 22.