Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

Саммерфилд Марк

Шрифт:

TCP является потокоориентированным протоколом. Для приложений данные представляются в виде большого потока данных, очень напоминающего большой однородный файл. Протоколы высокого уровня, построенные на основе TCP, являются либо строкоориентированными, либо блокоориентированными:

• строкоориентированные протоколы передают текстовые данные построчно, завершая каждую строку символом перехода на новую строку;

• блокоориентированные протоколы передают данные в виде двоичных блоков. Каждый блок имеет в начале поле, где указан его размер, и затем идут байты данных.

Класс QTcpSocket наследует QIODevice через класс QAbstractSocket, и поэтому чтение с него или запись на него могут производиться с применением средств класса QDataStream или QTextStream. Одно существенное отличие чтения данных из сети по сравнению с чтением обычного файла заключается в том, что мы должны быть уверены в получении достаточного количества данных от партнерского узла (peer) перед использованием оператора >>. В противном случае результат может быть непредсказуемым.

В данном разделе мы рассмотрим программный код клиента и сервера, которые используют пользовательский протокол блочной передачи. Клиент называется Trip Planner (планировщик путешествий) и позволяет пользователям составлять план путешествия на поезде. Сервер называется Trip Server (сервер путешествий) и обеспечивает клиента информацией о путешествии. Мы начнем с написания клиентского приложения Trip Planner.

Приложение Trip Planner содержит поле From (из пункта), поле To (до пункта), поле Date (дата), поле Approximate Time (приблизительное время) и два переключателя, определяющие приблизительное время отправления или прибытия. Когда пользователь нажимает клавишу Search, приложение посылает запрос на сервер, который возвращает список железнодорожных рейсов, которые удовлетворяют критериям пользователя. Этот список отображается в виджете QTableWidget в окне Trip Planner. В нижней части окна расположены текстовая метка QLabel, показывающая состояние последней операции, и индикатор состояния процесса QProgressBar.

Рис. 14.1. ПриложениеТпр Planner.

Пользовательский интерфейс приложения Trip Planner был создан при помощи QtDesigner в файле tripplanner.ui. Ниже мы основное внимание уделим исходному коду подкласса QDialog, который реализует функциональность приложения:

#include "ui_tripplanner.h"

01 class TripPlanner : public QDialog, public Ui::TripPlanner

02 {

03 Q_OBJECT

04 public:

05 TripPlanner(QWidget *parent = 0);

06 private slots:

07 void connectToServer;

08 void sendRequest;

09 void updateTableWidget;

10 void stopSearch;

11 void connectionClosedByServer;

12 void error;

13 private:

14 void closeConnection;

15 QTcpSocket tcpSocket;

16 quint16 nextBlockSize;

17 };

Класс TripPlanner наследует не только QDialog, но и Ui::TripPlanner (который генерируется компилятором uic, используя файл tripplanner.ui). Переменная—член tcpSocket инкапсулирует соединение TCP. Переменная nextBlockSize используется при синтаксическом анализе блоков, поступивших с сервера.

01 TripPlanner::TripPlanner(QWidget *parent)

02 : QDialog(parent)

03 {

04 setupUi(this);

05 QDateTime dateTime = QDateTime::currentDateTime;

06 dateEdit->setDate(dateTime.date);

07 timeEdit->setTime(QTime(dateTime.time.hour, 0));

08 progressBar->hide;

09 progressBar->setSizePolicy(QSizePolicy::Preferred,

10 QSizePolicy::Ignored);

11 tableWidget->verticalHeader->hide;

12 tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

13 connect(searchButton, SIGNAL(clicked),

14 this, SLOT(connectToServer));

15 connect(stopButton, SIGNAL(clicked), this, SLOT(stopSearch));

16 connect(&tcpSocket, SIGNAL(connected),

17 this, SLOT(sendRequest));

  • Читать дальше
  • 1
  • ...
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: