Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Клиент-серверное приложение: как лучше сделать? 
:(
    Опции темы
Aline
Дата 18.9.2013, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Мне необходимо реализовать следующее: я так понимаю, что это будет серверное приложение (если ошибаюсь - поправьте), которое может работать в двух режимах (причем наверно одновременно,но в тестовом варианте пока попеременно). Один режим: мы получаем посылку от клиента (какая то команда по TCP/IP) и на неё должны ответить должным образом. В другом режиме мы с сервера должны передавать набор команд (причем с паузой между командами) разово или циклически (устанавливается флаг цикличности).
Поскольку я с Qt только начала работать, то у меня возникли определенные трудности.
По книге Земскова пытаюсь делать сервер и клиент. Не знаю, может не то выбрала. Сервер - асинхронный однопоточный эхо-сервер.
  
Код

void MainWindow::on_pushBtnStart_clicked()
{
    QHostAddress host;
 
    tcpServer->close();
 
    if (ui->radioBtnTr->isChecked()){
      if (tr_host != "") host.setAddress(tr_host);
      else host = QHostAddress::Any;
 
      if (!tcpServer->listen(host, tr_port)){
          QMessageBox::critical(this, tr("TCP Server"), tr("Не могу запустить сервер: %1.")
                                .arg(tcpServer->errorString()), QMessageBox::Ok);
          tcpServer->close();
          return;
      }
      else QMessageBox::information(this, tr("TCP Server"), tr("Сервер готов к работе!"), QMessageBox::Ok);
 
    }
    else{
      if (rec_host != "") host.setAddress(rec_host);
      else host = QHostAddress::Any;
 
      if (!tcpServer->listen(host,rec_port)){
          QMessageBox::critical(this, tr("TCP Server"), tr("Не могу запустить сервер: %1.")
                                .arg(tcpServer->errorString()), QMessageBox::Ok);
          tcpServer->close();
          return;
      }
      else QMessageBox::information(this, tr("TCP Server"), tr("Сервер готов к работе!"), QMessageBox::Ok);
    }
    connect(this, SIGNAL(newConnection()),this, SLOT(addConection()));
}
 
void MainWindow::addConnection()
{
    QTcpSocket *client = tcpServer->nextPendingConnection();
    connect(client,SIGNAL(disconnected()), this, SLOT(removeConnection()));
    connect(client, SIGNAL(readyRead()), this, SLOT(onReceive()));
 
    m_clients.append(client);
}
 
void MainWindow::removeConnection()
{
    QTcpSocket *client = qobject_cast<QTcpSocket*>(sender());
    m_clients.removeAt(m_clients.indexOf(client));
 
    client->deleteLater();
}
 
void MainWindow::displayError(QAbstractSocket::SocketError)
{
//пока не наполняла
}
 
void MainWindow::onReceive()
{
    QTcpSocket *client = qobject_cast<QTcpSocket*>(sender());
    QByteArray block = client->readAll();
 
    QString s = block.data();
 
    ui->textEdtSvr->insertPlainText(s+"/n");
}
  
 
Сервер запускается и пишет,ч то готов к работе, т.е. ошибок не возникает.

Клиент для эхо-сервера:

Код

QTcpSocket socket;
    QByteArray block;
    QString s, host;
    qint64 port;
 
    host = ui->lineEdit_2->text();
 
    port = ui->lineEdit_3->text().toInt();
 
    socket.connectToHost(host,port);
 
    if (!socket.waitForConnected(5000)){
        ui->labelInfo->setText("Не удалось связаться с сервером: "+ socket.errorString());
        return;
    }
  
 
Здесь вроде проходит без ошибки. Но смущает то, что в сервернной части ставлю точку останова в процедуре AddConnection() и туда не попадаю. как проверить то,что соединение установлено или нет? Или может вообще всё неправильно делаю? Смотрела пример Fortune Server и Client, но что то там совсем мудреное... 

Это сообщение отредактировал(а) Aline - 18.9.2013, 10:51
PM MAIL   Вверх
Jeka178RUS
Дата 18.9.2013, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 3.9.2012

Репутация: нет
Всего: нет



delete

Это сообщение отредактировал(а) Jeka178RUS - 18.9.2013, 12:56
PM MAIL   Вверх
Aline
Дата 18.9.2013, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Jeka178RUS, что с этим делать?
PM MAIL   Вверх
Guinness
Дата 18.9.2013, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Код

connect(this, SIGNAL(newConnection()),this, SLOT(addConection()));

Здесь, видимо, неправильно написано. Нужно подключаться к сигналу от tcpServer.
PM MAIL   Вверх
Aline
Дата 18.9.2013, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Guinness, сейчас попробую изменить, но в книге именно так написано. А в остальном на первый взгляд нормальо?

Добавлено через 8 минут и 28 секунд
написала
Код

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


всё равно не срабатывает...
PM MAIL   Вверх
Guinness
Дата 18.9.2013, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Aline, можно после подключения, в сокет что-нибудь и записать, дабы проверить onReceive(). А потом и закрыть соединение, чтобы отследить как зыкрывается соединение на сервере.
А так сервер простейший, только не ясно, зачем там проверка ui->radioBtnTr->isChecked(), если обе ветки идентичны, за исключением прослушиваемого порта. Можно его выбрать, а не копипастить весь код из одной ветки в другую.
PM MAIL   Вверх
Aline
Дата 18.9.2013, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Guinness, разница будет в реализации. Пока просто тестирую. Я кажется поняла свою ошибку, сейчас переделаю. Если заработает, то выложу здесь smile
PM MAIL   Вверх
Aline
Дата 18.9.2013, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Guinness, всё, соединение установила, тперь дальше надо разбираться. Во-первых, в книге был создан клсс EchoServer на основе QTcpServer и реализация была сделана в классе. Я этого не заметила и делала всё в главном окне. Но самая глупая ошибка была в том (и скорее всего из-за этого и не получалось), что здесь:
Код

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


написано addConection, а в сама процедура называется addConnection. Он её просто не находил,но почему при этом не ругался
PM MAIL   Вверх
Guinness
Дата 18.9.2013, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата(Aline @  18.9.2013,  15:41 Найти цитируемый пост)
Он её просто не находил,но почему при этом не ругался

Обычно Qt в отладочной печате пишет, что не смог найти требуемый слот/сигнал. А для себя я давно уже написал обертку над connect, которая проверяет от него возвращаемое значение и, в случае false, выводит messageBox с ошибкой.
PM MAIL   Вверх
Aline
Дата 18.9.2013, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Guinness, не обратила внимание на это.
Сейчас вот соединение устанавливается, но потом почему то дисконнект вызывается,т.е. клиент получается отваливается
PM MAIL   Вверх
Snake174
Дата 19.9.2013, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 5.10.2011
Где: Miass

Репутация: нет
Всего: нет



Ну я так понимаю клиент коннектится, устанавливается соединение, передаются данные, соединение закрывается. Вроде всё так и должно быть.
Весь код выложи. Под винду или под линукс пишешь?

Добавлено @ 11:41
Небольшой пример

Это сообщение отредактировал(а) Snake174 - 19.9.2013, 11:46

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  client_server.zip 4,49 Kb
PM MAIL   Вверх
Aline
Дата 19.9.2013, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Snake174,  спасибо! Примерчик посмотрю. В дальнейшем планируется использовать под Линукс. Ошибки банальные, из-за невнимательности. Связь должна быть постоянной, пока смерть сервер(клиент) не разлучит их smile
Неправильно описала 
Код

QTcpSocket socket;


надо было либо вывести в глобальные либо 
Код

QTcpSocket *socket;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.2142 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.