Инструменты пользователя

Инструменты сайта


develop:qt:network

Это старая версия документа!


Поддержка сети Qt

qt += network
Для реализации серверного функционала используется класс QTcpServer.
Для непосредственного приема передачи используются сокеты (базовый класс QAbstractSocket), есть доп реализации Tcp, Udp, Ssl и т.д. Собсна клиент содержит в себе только объект сокета.
Для сетевых запросов существует класс QNetworkAccessManager.

QTcpServer


Позволяет принимать Tcp-соединения, порт можно выбрать либо авто, IP так же можно выбрать конкретный либо все IP хоста.

Вызовите listen(), для начала прослушивания. close() для завершения.
При подключении клиента, вызывается сигнал newConnection(). Вызовите nextPendingConnection() что бы принять соединение как QTcpSocket, который можно использовать для связи с клиентом.

В случае ошибки, serverError() возвращает тип ошибки, а errorString() вернут описание.

Сервер в основном предназначен для использования сигнало/слотами, имеются методы для блокирующей работы, типа «waitFor..».

QAbstractSocket


Является базовым классом для QTcp и QUdp сокетов, и содержит все общие функции этих двух классов. Его можно наследовать, для реализации собственного сокета.

Так же, API QAbstractSocket объединяет большинство различий между двумя протоколами.
Например метод connectToHost(), для Udp, устанавливает виртуальное соединение. QAbstractSocket запоминает адрес и порт, переданные в этот метод, и такие функции как read() или write() читают эти данные оттуда.

В любой момент, объект имеет определенное состояние (метод state()).
Начальное состояние- UnconnectedState.
После вызова connectToHost() сокет сначала входит в HostLookupState, если хост найден тогда переходит в ConnectingState и излучает сигнал hostFound().
После установки соединения, статус переходит в ConnectedState и излучает сигнал connected().
В случае ошибки, на любом этапе, выдается сигнал errorOcurred(). При смене состояния, генерируется stateChanged().
Метод isValid() возвращает bool, готов ли сокет к чтению/записи, но состояние должно быть ConnectedState.

Читать/писать данные можно методами: read(), write(), readLine(), readAll(), getChar(), putChar(), ungetChar().
Сигнал bytesWritten() возникает каждый раз, когда данные были записаны в сокет. Qt не ограничивает размер буфера записи, за ним можно следить используя этот сигнал.

Сигнал readyRead() выдается каждый раз, когда поступает новый блок данных, bytesAvailable() возвращает кол-во доступных байт.
Для чтения подключаемся к слоту readyRead() и читаем все доступные байты, если считать не все, то оставшиеся будут доступны позже, а любые входящие данные будут добавлены во внутренний буфер. Чтобы ограничить размер этого буфера, метод- setReadBufferSize().

Для закрытия соединения, метод disconnectFromHost(), сокет входит в состояние ClosingState и ждет очереди ожидающих данных, после нее, фактически закрывается соединение, переходит в UnconecctedState и посылает сигнал disconnected().
Если нужно немедленно прервать соединение, есть метод abort().
Если удаленный хост закрывает соединение, то сокет выдаст errorOcurrent(QAbstractSocket::RemoteHostClosedError), в течении которого состояние будет все еще ConnectedState, а затем будет сигнал disconnected().

Параметры удаленного узла (переданного в connectedToHost())- peerPort(), peerAddress(), peerName().
Локальные- localPort(), localAddress().

Так же есть ряд методов синхронизации потоков, типа «waitFor..».

QUdpSocket


Распространенный способ использования- привязка к адресу и порту с помощью bind(), затем вызов write/read/receiveDatagram(), можно не вызывать ее, если просто отправлять дейтаграммы.
Что бы использовать read(), readLine(), write() и т.д. нужно выполнить (условное) подключение к узлу, метод connectToHost().

Сигналы bytesWrite()/readyRead() вызываются при отправке/получении дейтаграмм.

QUdpSocket поддерживает многоадресную рассылку, {join,leave}Multicast{Group,Interface}.

Для работы с дейтаграммами используется класс QNetworkDatagram.

QNetworkAccessManager


API для доступа к сети построено вокруг этого объекта, содержит в общую конфигурацию и настройку отправляемых запросов, прокси, кэша, а так же связанные с сетевой работой слото-сигналы.
Одного экземпляра достаточно для всего приложения, вызывается только из своего потока.
Этот объект управляет авторизацией на ресурсе, если она необходима.

Для запросов и ответов есть классы QNetworkRequest и QNetworkReply соответственно.

QNetworkRequest


QNetworkReply


QHostAddress


Класс содержит адреса v4/v6.
Адрес устанавливается и извлекается, можно проверить его тип, поддерживает предопределенные адреса, типа LocalHost, Broadcast, Any.

:!: Пример:
 
develop/qt/network.1632722523.txt.gz · Последнее изменение: 2021/09/27 06:02 — admin