Home · All Classes · Main Classes · Grouped Classes · Modules · Functions

[Предыдущая: Модуль QtGui] [Модули Qt] [Следующая: Модуль QtOpenGL]

Модуль QtNetwork

Модуль QtNetwork предоставляет классы, позволяющие Вам создавать серверы и клиенты TCP/IP. Далее...

Классы

QAbstractSocketБазовая функциональность для всех типов сокетов
QFtpРеализация протокола FTP
QHostAddressIP-адрес
QHostInfoСтатические функции для имени хоста
QHttpРеализация протокола HTTP
QHttpHeaderЗаголовочная информация HTTP
QHttpRequestHeaderЗапрос информации заголовка HTTP
QHttpResponseHeaderОтвет с информацией заголовка HTTP
QNetworkProxyПрокси сетевого уровня
QTcpServerTCP-сервер
QTcpSocketTCP сокет
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 и FTP с помощью QHttp и QFtp

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

HTTP Client and Server

Протокол 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 с помощью QTcpSocket и QTcpServer

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

A TCP Stream

Класс 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 с помощью QUdpSocket

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

UDP Packets

Класс 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-получателя.

Обработка хост-имен с помощью QHostInfo

Перед установкой сетевого соединения, 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
Hosted by uCoz