Qt:Документация 4.3.2/qtnetwork

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск
40px Внимание: Актуальная версия перевода документации находится здесь

__NOTOC__

Image:qt-logo.png

Главная · Все классы · Основные классы · Классы по группам · Модули · Функции

Image:trolltech-logo.png

[Назад: Модуль QtGui ] [ Qt's Модули ] [Далее: Модуль QtOpenGL ]

Содержание

[править] Модуль QtNetwork

Модуль QtNetwork предоставляет классы, для написания TCP/IP клиентов и серверов. Подробней...

[править] Пространство имен

QSsl Хранит обьявления enum'ов общих для всех SSL классов в QtNetwork модуле

[править] Классы

QAbstractSocket Базовый функционал, общий для всех типов сокетов
QAuthenticator Обьект аутентификации
QFtp Реализация клиентской стороны FTP протокола
QHostAddress IP адресс
QHostInfo Статические функции для поиска имен
QHttp Реализация HTTP протокола
QHttpHeader Заголовочная информация для HTTP
QHttpRequestHeader Заголовочная информация HTTP запроса
QHttpResponseHeader Заголовочная информация HTTP ответа
QNetworkAddressEntry Хранит один IP адрес поддерживаемый сетевым интерфейсом, вместе с маской сети и broadcast address
QNetworkInterface Список IP адресов компьютеров и сетевых интерфейсов
QNetworkProxy Работа с прокси
QSslCertificate Традиционное API для сертификатов X509
QSslCipher Работа с SSL криптографией
QSslError SSL ошибка
QSslKey Интерфейс для закрытых и открытых ключей
QSslSocket Зашифрованный SSL socket для клиентов и серверов
QTcpServer TCP сервер
QTcpSocket TCP сокет
QUdpSocket UDP сокет
QUrlInfo Хранилище информации о URL'ях

[править] Детальное описание

Модуль работы с сетью, предоставляет классы, которые помогают сделать сетевое программирование проще и переносимей. Он предлагает как классы высокого уровня, такие как QHttp и QFtp, которые имплементируют специфичные протоколы уровня приложений, и классы низкого уровня, такие как QTcpSocket, QTcpServer, и QUdpSocket.

Модуль QtNetwork является частью Qt Console Edition, Qt Desktop Edition, и Qt Open Source Edition.

Темы:

[править] Конфигурирование процесса сборки

Приложения, которые используют сетевые классы Qt, нужно сконфигурировать, чтобы их можно было собрать с модулем QtNetwork. Следующая декларация в файле проекта qmake гарантирует, что приложение будет собрано и связано с данным модулем:

 QT += network

Эта строка необходима, так как по умолчанию только модули QtCore и QtGui используются в процессе сборки.

Чтобы включить определения классов данного модуля, используйте следующую директиву:

 #include <QtNetwork>

[править] Написание HTTP и FTP клиентов с помощью классов QHttp и QFtp

HTTP (Hypertext Transfer Protocol) является протоколом сети прикладного уровня, который используется главным образом для того, чтобы загружать HTML и XML файлы, а также как транспортный протокол высокого уровня для многих других типов данных, от картинок и кинофильмов, до заказов на поставку и банковским операциям. FTP (File Transfer Protocol) используется исключительно для просмотра удаленных директорий и для передачи файлов.

center

HTTP более простой протокол чем FTP. Он использует одно сетевое соединение, FTP же использует два (одно для отправки команд, другое для передачи данных). У HTTP протокола нет своего состояния; Запросы и ответы выполняются всегда раздельно. У FTP протокола имеется свое состояние и он требует, чтобы клиент послал некоторое количество команд, прежде чем начать передачу файла.

Практически, клиенты HTTP часто используют отдельные соединения для отдельных запросов, тогда как клиенты FTP устанавливают одно соединение и держат его открытым в течении всей сессии.

Классы QHttp и QFtp предоставляют поддержку протоколов HTTP и FTP на клиентской стороне. Так как эти два протокола используются для решении похожих задач, QHttp и QFtp классы имеют много общих особенностей:

  • Не блокирующее поведение . QHttp и QFtp асинхронны. Вы можете отправить ряд команд ("requests" для HTTP). Команды выполнятся позже, когда управление вернется к циклу событий Qt.
  • ID команд. Каждая команда имеет свой уникальный номер ID, который используется для слежения за выполнением команд. Например, QFtp передает commandStarted() и commandFinished() сигналы с ID для каждой команды, которая выполняется или выполнена. У QHttp тоже имеются подобные сигнылы requestStarted() и requestFinished().
  • Индикаторы процесса передачи данных. QHttp и QFtp используют сигналы при передаче данных ( QFtp::dataTransferProgress(), QHttp::dataReadProgress(), и QHttp::dataSendProgress()). Вы можете соединить данные сигналы например с QProgressBar::setProgress() или QProgressDialog::setProgress().
  • QIODevice поддержка. Оба класса поддерживают загрузку из и в QIODevices, дополнительно к API QByteArray.

Есть два основных способа использования QHttp и QFtp. Самый обычный способ состоит в том, чтобы отслеживать ID команд и следить за выполнением каждой команды соединившись с соответствующим сигналом. Другой способ состоит в том, чтобы запланировать все команды сразу и соединиться только с сигналом done(), который посылается когда все команды были выполнены. Первый способ требует большего количества работы, но дает больший контроль над выполнением конкретных задач и позволяет вводить дополнительные команды основанные на результате предыдущих. Что позволяет обеспечить пользователю детализированную обратную связь.

В примерах HTTP и FTP показано, как можно написать свой HTTP или FTP клиент.

Для написания собственного HTTP или FTP сервера понадобиться использование классов низкого уровня QTcpSocket и QTcpServer.

[править] Использование TCP с помощью классов QTcpSocket и QTcpServer

TCP (Transmission Control Protocol) является сетевым протоколом низкого уровня, используемым в соответствии с большинством интернет-протоколов, включая HTTP и FTP, для передачи данных. Это - надежный, stream-oriented или connection-oriented транспортный протокол. Он особенно хорошо подходит для непрерывной передачи данных.

center

Класс QTcpSocket предоставляет интерфейс для TCP. Вы можете использовать QTcpSocket для создания стандартных сетевых протоколов таких как POP3, SMTP и NNTP, и для других.

Перед передачей данных должно быть установлено TCP соединение. Как только связь была установлена, IP адресс и порт соединения доступны через QTcpSocket::peerAddress() и QTcpSocket::peerPort(). В любое время, соединение может быть закрыто, и тогда передача данных будет немедленно остановлена.

QTcpSocket работает асинхронно и посылает сигналы сообщающие о статусе изменений и ошибок, точно так же как в QHttp и QFtp. Что зависит от цикла событий для обнаружения поступающих данных и автоматического сброса отправляемых. Записывать данные в сокет можно используя QTcpSocket::write(), а читать данные используя QTcpSocket::read(). QTcpSocket предоставляет два независимых потока данных: один для чтения, другой для записи.

Так как QTcpSocket унаследован от QIODevice, можно использовать его и с QTextStream и QDataStream. При чтении из QTcpSocket, нужно удостовериться, что доступно достаточно данных, это можно сделать вызова QTcpSocket::bytesAvailable().

Если нужно получить указатель на входящее TCP соединение (в серверном приложении), используйте класс QTcpServer. Вызвав QTcpServer::listen() установите сервер, и соединитесь с сигналом QTcpServer::newConnection(), который посылается для каждого клиента при соединении. В слоте, вызовите QTcpServer::nextPendingConnection() для того, чтобы принять соединение и использовать возвращаемый QTcpSocket для общения с клиентом.

Хотя большинство его функций работает асинхронно, возможно синхронное использование QTcpSocket (в блокирующем режиме). Чтобы установить блокирующий режим вызовите функции QTcpSocket waitFor...(); они приостанавливают выполнение потока до тех пор, пока не будет получен сигнал. Например, после вызова не блокирующей функции QTcpSocket::connectToHost(), вызовите QTcpSocket::waitForConnected(), чтобы блокировать поток до получения сигнала connected().

Использование синхронных сокетов часто приводит к более простому коду. Главное неудобство waitFor ... () подхода состоит в том, что события не будут обрабатываться, пока поток блокируется функцией waitFor ... (). Если использовать в GUI потоке, то это может "заморозить" пользовательский интерфейс приложения. Поэтому мы рекомендуем использовать синхронные сокеты только в не GUI потоках. QTcpSocket при синхронном использовании не требует цикла событий.

В примерах Fortune Client и Fortune Server показано как использовать QTcpSocket и QTcpServer для написания TCP client-server приложений. Также смотрите Blocking Fortune Client в качестве примера использования синхронного QTcpSocket в отдельном потоке (не используя цикл событий) и Threaded Fortune Server в качестве примера мульти поточного TCP сервера, с одним потоком на каждого клиента.

[править] Использование UDP с помощью класса QUdpSocket

UDP (User Datagram Protocol) легкий, ненадежный, датаграмм ориентированный протокол, не требующий установки соединения. Он может быть использован, когда не важна надежность. Например, сервер сообщающий время может использовать UDP. Если датаграма с временем потеряна, клиент просто может сделать новый запрос.

center

Класс QUdpSocket позволяет отправлять и принимать UDP датаграммы. Он унаследован от QAbstractSocket, и поэтому похож на интерфейс QTcpSocket. Основное различие состоит в том, что QUdpSocket передает данные как датаграммы, а не непрерывным потоком. Вкратце, датаграмма это пакет данных ограниченного размера (обычно менее 512 байтов), дополнительно к передаваемым данным, содержащий IP адрес и порт отправителя и приемника датаграммы.

QUdpSocket поддерживает IPv4 broadcasting. Broadcasting часто используется для реализации сетевых протоколов обнаружения, например, такой как поиск хоста в сети, на котором больше всего свободного места на диске. Один хост передает датаграмму по сети, которую получают все хосты. Каждый хост, который получил запрос, посылает ответ отправителю с его текущим количеством свободного дискового пространства. Создатель запроса ждет, пока не получит ответы от всех хостов, после чего выбирает сервер с большим свободным местом, чтобы хранить данные. Чтобы передать датаграмму, просто пошлите ее специальному адресу QHostAddress::Broadcast (255.255.255.255), или широковещательному адресу вашей местной сети.

QUdpSocket::bind() подготавливает сокет для получения входящих датаграм, вызов QTcpServer::listen() для TCP серверов. Всякий раз, когда прибывает одна или более датаграмм, QUdpSocket отправляет сигнал readyRead(). Для чтения датаграмм используется QUdpSocket::readDatagram().

Broadcast Sender и Broadcast Receiver примеры показывающие как написать UDP отправитель и UDP получатель используя Qt.

[править] Получение имен компьютеров используя класс QHostInfo

Перед установкой сетевого соединения, QTcpSocket и QUdpSocket выполняет поиск имени, переводя имя компьютера, с которым соединяется в IP адрес. Эта операция обычно выполняется с помощью DNS протокола (Domain Name Service).

QHostInfo предоставляет статическую функцию, с помощью которой можно выполнить такой поиск самостоятельно. При вызове QHostInfo::lookupHost() с именем компьютера, указателем на QObject, и сигнатурой слота, QHostInfo выполнит поиск имени и когда результаты будут готовы, вызовет заданный слот. Поиск происходит в отдельном потоке, используя собственные методы операционной системы.

QHostInfo также предоставляет статическую функцию QHostInfo::fromName(), которая в качестве аргумента получает имя компьютера и возвращает результат. В этом случае, поиск имени происходит в том же потоке, где была вызвана данная функция. Эта перегрузка полезна в не-GUI приложениях или для поиска имени отдельно от не-GUI потока. (При вызове данной функции в GUI потоке, пользовательский интерфейс не будет отвечать пока функция выполняет поиск.)

[Назад: QtGui Module ] [ Qt's Modules ] [Далее: QtOpenGL Module ]


Copyright © 2007 Trolltech Trademarks
Qt 4.3.2