Home · All Classes · Main Classes · Grouped Classes · Modules · Functions |
[Предыдущая: Модуль QtGui] [Модули Qt] [Следующая: Модуль QtOpenGL]
Модуль QtNetwork предоставляет классы, позволяющие Вам создавать серверы и клиенты TCP/IP. Далее...
QAbstractSocket | Базовая функциональность для всех типов сокетов |
QFtp | Реализация протокола FTP |
QHostAddress | IP-адрес |
QHostInfo | Статические функции для имени хоста |
QHttp | Реализация протокола HTTP |
QHttpHeader | Заголовочная информация HTTP |
QHttpRequestHeader | Запрос информации заголовка HTTP |
QHttpResponseHeader | Ответ с информацией заголовка HTTP |
QNetworkProxy | Прокси сетевого уровня |
QTcpServer | TCP-сервер |
QTcpSocket | TCP сокет |
QUdpSocket | Сокет UDP |
QUrlInfo | Содержит информацию об адресах URL |
Модуль QtNetwork предоставляет классы, позволяющие Вам создавать серверы и клиенты TCP/IP.
Модуль работы с сетью представляет классы, делающие программирование сетевых приложений более легким, а сами сетевые приложения протируемыми на другие платформы. Он предлагает классы высокого уровня, такие как 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 (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) - это низкоуровневый сетевой протокол, используемый большинством протоколов передачи данных Internet, включая 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 работают асинхронно, он может использоваться и синхронно (т.е., с блокировкой). Для получения блокироющего поведения, вызовите функции QTcpSocket waitFor...(); они приостанавливают вызывающий поток пока не будет испущен сигнал. Например, после вызова неблокирующей функции QTcpSocket::connectToHost(), вызовите QTcpSocket::waitForConnected() для блокировки потока пока не будет испущен сигнал connected().
Синхронные сокеты часто требуют более простого программирования потока управления. Главное неудобство подхода waitFor...() - это невозможность обрабатывать сообщения во время осуществления блокировки функцией waitFor...(). Если используется поток GUI, то это может привести к замораживанию пользовательского интерфейса приложения. Поэтому мы рекомендуем использовать синхронные сокеты только в не-GUI потоках. При синхронном использовании, QTcpSocket не обращается к циклу обработки сообщений.
Примеры Fortune Client и Fortune Server показывают использование QTcpSocket и QTcpServer для написания клиент-серверного приложения TCP. Пример использования синхронного QTcpSocket в отдельном потоке (без использования цикла обработки сообщений) см. в Blocking Fortune Client, а пример многопоточного TCP-сервера с однопоточным активным клиентом см. в Threaded Fortune Server.
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 может привести к замораживанию пользовательского интерфейса, пока функция выполняет поиск.)
[Предыдущая: Модуль QtGui] [Модули Qt] [Следующая: Модуль QtOpenGL]
Copyright © 2005 Trolltech | Trademarks | Qt 4.1.0 |