Оглавление
Сетевое программированиеМодуль QtNetwork предоставляет классы для написания клиентов и серверов TCP/IP. Он предлагает классы, такие как QFtp, которые реализуют специфические протоколы уровня приложения (application-level), низкоуровневые классы, такие как QTcpSocket, QTcpServer и QUdpSocket, которые представляют низкоуровневые сетевые концепции, и высокоуровневые классы, такие как QNetworkRequest, QNetworkReply и QNetworkAccessManager для представления сетевых операций с использованием распространенных протоколов. Он также предлагает классы, например QNetworkConfiguration, QNetworkConfigurationManager и QNetworkSession, которые реализуют управление однонаправленным каналом. Классы Qt для программирования сетевых приложенийСледующие классы предоставляют поддержку программирования сетевых приложений в Qt.
Высокоуровневые сетевые операции для HTTP и FTPAPI доступа к сети - коллекция классов для выполнения простых сетевых операций. API предоставляет уровень абстракции (abstraction layer) над используемыми специфичными операциями и протоколами (например, получение и отправка данных через HTTP), и только видимые (exposes) классы, функции и сигналы для обычных или высокоуровневых концепций. Сетевые запросы представляются с помощью класса QNetworkRequest, который также выступает в качестве общего контейнера для информации, связанной с запросом, например, любая заголовочная информация и используемое шифрование. URL указывается когда объект запроса создан, определяя используемый для запроса протокол. В настоящее время HTTP, FTP и URLы на локальные файлы поддерживаются для загрузки и выгрузки. Координацию сетевых операций выполняет класс QNetworkAccessManager. Этот класс используется для отправки созданного запроса и испускания сигналов, сообщающих о ходе выполнения. Менеджер также координирует использование cookies для сохранения данных у клиента, запросы на аутентификацию и использование прокси. Ответы на сетевые запросы представляет класс QNetworkReply; после отправки запроса они создаются QNetworkAccessManager'ом. Сигналы, предоставляемые QNetworkReply, могут быть использованы для наблюдения за каждым ответом по отдельности, или же вместо этого разработчики могут выбрать для этих целей использование управляющих сигналов (manager's signals) и отвергать ссылки на ответы. Так как QNetworkReply является подклассом QIODevice, ответы могут обрабатываться синхронно или асинхронно; т.е., как блокирующие или неблокирующие операции. Каждое приложение или библиотека может создать один или более экземпляров класса QNetworkAccessManager для обработки сетевого взаимодействия. Написание FTP-клиентов с помощью QFtpFTP (File Transfer Protocol) - протокол, используемый исключительно для просмотра удаленных каталогов и для передачи файлов. FTP использует два сетевых соединения, одно - для отправки команд, а второе - для приёма данных. У протокола FTP имеется свое состояние и он требует, чтобы клиент послал некоторое количество команд, прежде чем начать передачу файла. Клиенты FTP устанавливают соединение и держат его открытым в течение всей сессии. В каждой сессии может происходить несколько передач данных. Класс QFtp предоставляет поддержку для FTP со стороны клиента. Он имеет следующие характеристики:
Есть два основных способа использования QFtp. Самый обычный способ состоит в том, чтобы отслеживать ID команд и следить за выполнением каждой команды, соединившись с соответствующим сигналом. Другой способ состоит в том, чтобы запланировать все команды сразу и соединиться только с сигналом done(), который посылается, когда все команды были выполнены. Первый способ требует большего количества работы, но дает больший контроль над выполнением конкретных задач и позволяет вводить дополнительные команды, основанные на результате предыдущих. Что позволяет обеспечить пользователю детализированную обратную связь. Пример "FTP" иллюстрирует как писать FTP-клиент. Для написания собственного HTTP- или FTP-сервера понадобится использование классов низкого уровня QTcpSocket и QTcpServer. Использование TCP с помощью классов QTcpSocket и QTcpServerTCP (Transmission Control Protocol) является сетевым протоколом низкого уровня, используемым в большинстве интернет-протоколов, включая HTTP и FTP, для передачи данных. Это надежный, потокоориентированный, основывающийся на соединениях транспортный протокол. Особенно хорошо он подходит для непрерывной передачи данных. Класс QTcpSocket предоставляет интерфейс для TCP. Вы можете использовать QTcpSocket для создания стандартных сетевых протоколов таких как POP3, SMTP и NNTP, и для других. Перед передачей данных должно быть установлено TCP-соединение с удаленным узлом и портом. Как только связь была установлена, IP-адрес и порт соединения доступны через QTcpSocket::peerAddress() и QTcpSocket::peerPort(). В любое время соединение может быть закрыто, и тогда передача данных будет немедленно остановлена. QTcpSocket работает асинхронно и посылает сигналы, сообщающие об изменении статуса и ошибках, точно так же как в QNetworkAccessManager и 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 с помощью класса QUdpSocketUDP (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-получатель. QUdpSocket также поддерживает многоадресную передачу. Примеры "Multicast Sender" и "Multicast Receiver" показывают, как написать клиенты многоадресной передачи UDP. Получение имен компьютеров, используя класс QHostInfoПеред установкой сетевого соединения 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; подробности смотрите документацию класса. Поддержка управления однонаправленным каналомУправление однонаправленным каналом управляет состоянием возможности подключения устройства из условия, чтобы приложение могло начать или остановить сетевые интерфейсы и прозрачно автоматически переключиться между точками доступа. Класс QNetworkConfigurationManager управляет списком сетевых конфигураций, известных устройству. Сетевая конфигурация описывает набор параметров, используемых для запуска сетевого интерфейса и представляются классом QNetworkConfiguration. Сетевой интерфейс запускается открытием QNetworkSession на основе заданной сетевой конфигурации. В большинстве ситуаций подходит создание сетевой сессии на основе сетевой конфигурации по умолчанию, специфичной для платформы. Сетевая конфигурация по умолчанию возвращается функцией QNetworkConfigurationManager::defaultConfiguration(). На некоторых платформах требованием платформы является открытие приложением сетевой сессии до выполнения любых сетевых операций. Это можно протестировать наличием флага QNetworkConfigurationManager::NetworkSessionRequired в возвращаемом значении функции QNetworkConfigurationManager::capabilities(). Смотрите также Управление однонаправленным каналом. |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |