[Предыдущая: Модуль QtGui] [Модули Qt] [Следующая: Модуль QtOpenGL] Модуль QtNetwork
|
QSsl | Хранит объявления перечислений, общих для всех классов SSL в модуле QtNetwork |
---|
QAbstractNetworkCache | Интерфейс для реализаций кэша |
---|---|
QAbstractSocket | Базовый функционал, общий для всех типов сокетов |
QAuthenticator | Объект аутентификации |
QFtp | Реализация клиентской стороны FTP-протокола |
QHostAddress | IP-адрес |
QHostInfo | Статические функции для поиска имен хостов |
QHttp | Реализация HTTP-протокола |
QHttpHeader | Содержит заголовочную информацию HTTP |
QHttpRequestHeader | Содержит заголовочную информацию запроса HTTP |
QHttpResponseHeader | Содержит заголовочную информацию ответа HTTP |
QLocalServer | Локальный сервер, основанный на сокетах |
QLocalSocket | Локальный сокет |
QNetworkAccessManager | Разрешает приложению отправлять по сети запросы и получать ответы |
QNetworkAddressEntry | Хранит один IP-адрес, поддерживаемый сетевым интерфейсом, вместе с маской сети и широковещательным адресом |
QNetworkCacheMetaData | Информация о кэше |
QNetworkCookie | Содержит один сетевой объект cookie |
QNetworkCookieJar | Реализует простой архив jar объектов QNetworkCookie |
QNetworkDiskCache | Очень простой дисковый кэш |
QNetworkInterface | Список IP-адресов компьютеров и сетевых интерфейсов |
QNetworkProxy | Работа с прокси |
QNetworkProxyFactory | Очень точный выбор прокси |
QNetworkProxyQuery | Используется для запроса настроек прокси для сокета |
QNetworkReply | Содержит данные и заголовки для запроса, отправляемого с помощью QNetworkAccessManager |
QNetworkRequest | Содержит один запрос, отправляемый с помощью Network Access API |
QSslCertificate | Вспомогательное API для сертификатов X509 |
QSslCipher | Работа с SSL криптографией |
QSslConfiguration | Содержит конфигурацию и состояние соединения SSL |
QSslError | Ошибка SSL |
QSslKey | Интерфейс для закрытых и открытых ключей |
QSslSocket | Зашифрованный SSL-сокет для клиентов и серверов |
QTcpServer | TCP-сервер |
QTcpSocket | TCP-сокет |
QUdpSocket | UDP-сокет |
QUrlInfo | Хранит информацию об адресах URL |
Модуль работы с сетью предоставляет классы, которые помогают сделать сетевое программирование проще и переносимей. Он предлагает классы, такие как QHttp и QFtp, которые реализуют специфические протоколы уровня приложения (application-level), низкоуровневые классы, такие как QTcpSocket, QTcpServer и QUdpSocket, которые представляют низкоуровневые сетевые концепции, и высокоуровневые классы, такие как QNetworkRequest, QNetworkReply и QNetworkAccessManager для представления сетевых операций с использованием распространенных протоколов.
Модуль QtNetwork является частью Выпуска Qt Full Framework и Версий Open Source Qt.
Темы:
Приложения, которые используют сетевые классы Qt, нужно сконфигурировать, чтобы их можно было собрать с модулем QtNetwork. Следующая декларация в файле проекта qmake гарантирует, что приложение будет скомпилировано и связано с данным модулем:
QT += network
Эта строка необходима, так как по умолчанию только модули QtCore и QtGui используются в процессе сборки.
Для включения определений классов этого модуля используйте следующую директиву:
#include <QtNetwork>
API доступа к сети - коллекция классов для выполнения простых сетевых операций. API предоставляет уровень абстракции (abstraction layer) над используемыми специфичными операциями и протоколами (например, получение и отправка данных через HTTP), и только видимые (exposes) классы, функции и сигналы для обычных или высокоуровневых концепций.
Сетевые запросы представляются с помощью класса QNetworkRequest, который также выступает в качестве общего контейнера для информации, связанной с запросом, например, любая заголовочная информация и используемое шифрование. URL указывается когда объект запроса создан, определяя используемый для запроса протокол.
Координацию сетевых операций выполняет класс QNetworkAccessManager. Этот класс используется для отправки созданного запроса и испускания сигналов, сообщающих о ходе выполнения. Менеджер также координирует использование cookies для сохранения данных у клиента, запросы на аутентификацию и использование прокси.
Ответы на сетевые запросы представляет класс QNetworkReply; после отправки запроса они создаются QNetworkAccessManager'ом. Сигналы, предоставляемые QNetworkReply, могут быть использованы для наблюдения за каждым ответом по отдельности, или же вместо этого разработчики могут выбрать для этих целей использование управляющих сигналов (manager's signals) и отвергать ссылки на ответы. Так как QNetworkReply является подклассом QIODevice, ответы могут обрабатываться синхронно или асинхронно; т.е., как блокирующие или неблокирующие операции.
Каждое приложение или библиотека может создать один или более экземпляров класса QNetworkAccessManager для обработки сетевого взаимодействия.
HTTP (Hypertext Transfer Protocol) является протоколом сети прикладного уровня, который используется главным образом для того, чтобы загружать HTML и XML файлы, а также как транспортный протокол высокого уровня для многих других типов данных, от картинок и кинофильмов, до заказов на покупку и банковских операций. FTP (File Transfer Protocol) используется исключительно для просмотра удаленных каталогов и для передачи файлов.
Во многих отношениях HTTP более простой протокол, чем FTP. Он использует одно сетевое соединение, FTP же использует два (одно для отправки команд, другое для передачи данных). HTTP - протокол без запоминания состояния; запросы и ответы выполняются всегда раздельно. У протокола FTP имеется свое состояние и он требует, чтобы клиент послал некоторое количество команд, прежде чем начать передачу файла.
На практике HTTP-клиенты часто используют отдельные соединения для отдельных запросов, тогда как FTP-клиенты устанавливают одно соединение и держат его открытым в течение всей сессии.
Классы QHttp и QFtp предоставляют поддержку протоколов HTTP и FTP на клиентской стороне. Так как эти два протокола используются для решении похожих задач, классы QHttp и QFtp имеют много общих особенностей:
Есть два основных способа использования QHttp и QFtp. Самый обычный способ состоит в том, чтобы отслеживать ID команд и следить за выполнением каждой команды, соединившись с соответствующим сигналом. Другой способ состоит в том, чтобы запланировать все команды сразу и соединиться только с сигналом done(), который посылается, когда все команды были выполнены. Первый способ требует большего количества работы, но дает больший контроль над выполнением конкретных задач и позволяет вводить дополнительные команды, основанные на результате предыдущих. Что позволяет обеспечить пользователю детализированную обратную связь.
В примерах HTTP и FTP показано, как можно написать свой HTTP- или FTP-клиент.
Для написания собственного HTTP- или FTP-сервера понадобится использование классов низкого уровня QTcpSocket и QTcpServer.
TCP (Transmission Control Protocol) является сетевым протоколом низкого уровня, используемым в большинстве интернет-протоколов, включая HTTP и FTP, для передачи данных. Это надежный, потокоориентированный, основывающийся на соединениях транспортный протокол. Особенно хорошо он подходит для непрерывной передачи данных.
Класс 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 (в блокирующем режиме). Чтобы установить блокирующий режим вызовите функции waitFor...() QTcpSocket'а; они приостанавливают выполнение потока до тех пор, пока не будет получен сигнал. Например, после вызова неблокирующей функции QTcpSocket::connectToHost(), вызовите QTcpSocket::waitForConnected(), чтобы блокировать поток до получения сигнала connected().
Использование синхронных сокетов часто приводит к более простому коду. Главное неудобство waitFor...() подхода состоит в том, что события не будут обрабатываться, пока поток блокируется функцией waitFor...(). Если использовать в GUI потоке, то это может "заморозить" пользовательский интерфейс приложения. Поэтому мы рекомендуем использовать синхронные сокеты только в не-GUI потоках. QTcpSocket при синхронном использовании не требует цикла событий.
В примерах Fortune Client и Fortune Server показано, как использовать QTcpSocket и QTcpServer для написания TCP клиент-серверных приложений. Также смотрите Blocking Fortune Client в качестве примера использования синхронного QTcpSocket в отдельном потоке (не используя цикл событий) и Threaded Fortune Server в качестве примера многопоточного TCP-сервера, с одним потоком на каждого клиента.
UDP (User Datagram Protocol) - легкий, ненадежный, датаграмм ориентированный протокол, не требующий установки соединения протокол. Он может быть использован, когда не важна надежность. Например, сервер, сообщающий время, может использовать UDP. Если датаграмма со временем потеряна, клиент просто может сделать новый запрос.
Класс QUdpSocket позволяет отправлять и принимать UDP-датаграммы. Он унаследован от QAbstractSocket, и поэтому его интерфейс похож на интерфейс QTcpSocket. Основное различие состоит в том, что QUdpSocket передает данные как датаграммы, а не непрерывным потоком. Вкратце, датаграмма - это пакет данных ограниченного размера (обычно менее 512 байтов), дополнительно к передаваемым данным, содержащий IP-адрес и порт отправителя и получателя датаграммы.
QUdpSocket поддерживает IPv4 широковещание. Широковещание часто используется для реализации сетевых протоколов обнаружения, например, поиск хоста в сети, на котором больше всего свободного места на диске. Один хост передает датаграмму по сети, которую получают все хосты. Каждый хост, который получил запрос, посылает ответ отправителю со своим текущим размером свободного дискового пространства. Инициатор запроса ждет, пока не получит ответы ото всех хостов, после чего выбирает сервер с наибольшим размером свободного места, чтобы хранить данные. Чтобы передать датаграмму просто пошлите ее на специальный адрес QHostAddress::Broadcast (255.255.255.255) или на широковещательный адрес вашей локальной сети.
QUdpSocket::bind() подготавливает сокет для получения входящих датаграмм, подобно QTcpServer::listen() для TCP-серверов. Всякий раз, когда прибывает одна или более датаграмм, QUdpSocket испускает сигнал readyRead(). Для чтения датаграмм используется QUdpSocket::readDatagram().
Примеры Broadcast Sender и Broadcast Receiver показывают, как используя Qt написать UDP-отправитель и UDP-получатель.
Перед установкой сетевого соединения QTcpSocket и QUdpSocket выполняет поиск имени, переводя имя компьютера, с которым соединяется, в IP-адрес. Эта операция обычно выполняется с помощью протокола DNS (Domain Name Service).
QHostInfo предоставляет статическую функцию, с помощью которой можно выполнить такой поиск самостоятельно. При вызове QHostInfo::lookupHost() с именем компьютера, указателем на QObject и сигнатурой слота, QHostInfo выполнит поиск имени и, когда результаты будут готовы, вызовет заданный слот. Поиск происходит в отдельном потоке, используя собственные методы операционной системы.
QHostInfo также предоставляет статическую функцию QHostInfo::fromName(), которая в качестве аргумента получает имя компьютера и возвращает результат. В этом случае поиск имени происходит в том же потоке, где была вызвана данная функция. Эта перегрузка полезна в не-GUI приложениях или для поиска имени в отдельном, не-GUI, потоке. (При вызове данной функции в GUI потоке, пользовательский интерфейс не будет отвечать, пока функция выполняет поиск.)
Сетевое взаимодействие с Qt может выполняться через прокси, которая направляет или фильтрует сетевой трафик между локальным и удалённым соединением.
Отдельное прокси представляются классом QNetworkProxy, который используется для описания и конфигурирования соединения с прокси. Поддерживаются типы прокси, которые работают на разных уровнях сетевого взаимодействия, с поддержкой SOCKS 5 - разрешает проксирование (proxying) сетевого трафика на низком уровне, а HTTP и FTP проксирование (proxying) работает на протокольном уровне. Для получения дополнительной информации смотрите QNetworkProxy::ProxyType.
Проксирование можно разрешить для каждого сокета отдельно или для всех сетевых взаимодействий в приложении. Заново открытый сокет использовал прокси, вызвав свою функцию QAbstractSocket::setProxy() перед соединением. Проксирование во всем приложении можно разрешить для всех последующих соединений с сокетами посредством использования функции QNetworkProxy::setApplicationProxy().
Фабрики прокси используются для создания политик использования прокси. QNetworkProxyFactory предоставляет прокси основанное на запросах для указанных типов прокси. Сами по себе запросы закодированы в объектах QNetworkProxyQuery, которые разрешают выбирать прокси на основе ключевого критерия, например, назначение прокси (TCP, UDP, TCP-сервер, запрос URL), локальный порт, удалённый узел и порт, а также используемый протокол (HTTP, FTP и т.д.).
QNetworkProxyFactory::proxyForQuery() используется непосредственно для запроса фабрики. Политика проксирования всего приложения может быть реализована передачей фабрики в QNetworkProxyFactory::setApplicationProxyFactory(), а пользовательская политика проксирования может быть создан через подклассы QNetworkProxyFactory; подробности смотрите документацию класса.
[Предыдущая: Модуль QtGui] [Модули Qt] [Следующая: Модуль QtOpenGL]
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies) | Торговые марки | Qt 4.5.3 |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |