Сеть и работа с WEB
Выбери формат для чтения
Загружаем конспект в формате pptx
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Qt:
Сеть и работа с WEB
1
Сетевое взаимодействие Qt
● QNetworkAccessManager - интерфейс для
отправки и получения запросов по сети
○ QFtp
○ QHttp
● QTcpSocket и QTcpServer - ТСР сокеты
○ QSslSocket - шифрованный ТСР сокет
● QUdpSocket - доступ к UDP сокетам
● QWebSocket - web протокол для обмена
информацией между клиентом и сервером
2
Подключение модулей
● Файл проекта
QT += network
● Заголовочный файл
#include
3
Низкоуровневы е протоколы
TCP
UDP
непрерывная передача данных
передача пакетов данных
гарантированный порядок доставки
пакетов
отправил и забыл
пересылка только между сокетами
(точка-точка)
точка-точка или широковещательные
сообщения
Идеален когда важна аккуратная
доставка данных
Идеален, когда время важнее
качества доставки
4
ТСР сокеты
● два класса сокетов
○ QTcpSocket - реализует сокет
○ QTcpServer - реализует сервер,
прослушивающий соединения и создающий сокет
QTcpSocket для каждого соединения
5
ТСР сокеты . Порядок работы
6
ТСР сервер. Пример
прослушивает порт 55555 и посылает сигнал
newConnection при новом соединении
Server::Server() : QObject(0)
{
m_tcpServer = new QTcpServer(this);
connect(m_tcpServer, SIGNAL(newConnection()),
this, SLOT(serverConnected()));
m_tcpServer->listen(QHostAddress::Any, 55555);
}
7
ТСР сервер. Пример
получить соединение nextPendingConnection
void Server::serverConnected(){
QTcpSocket *connection= m_tcpServer->nextPendingConnection();
connect(connection, SIGNAL(disconnected()),
connection, SLOT(deleteLater()));
QByteArray buffer;//Ответ помещается в буфер:
//… см.40
connection->write(buffer);
connection->disconnectFromHost();
}
8
ТСР сервер. Пример
получить соединение nextPendingConnection
void Server::serverConnected(){
...
QByteArray buffer;//Ответ помещается в буфер:
QDataStream out(&buffer, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_6);
QString greeting = QString("Hello! The time is %1")
.arg(QTime::currentTime().toString());
out << (quint16)0;
out << greeting;
out.device()->seek(0);
out << (quint16)(buffer.size() - sizeof(quint16));
...
}
9
ТСР клиент. Пример
● Используем QTcpSocket для подключения к
серверу
○ сигнал readyRead
Сlient::Client() : QObject(0)
{
m_tcpSocket = new QTcpSocket(this);
connect(m_tcpSocket, SIGNAL(readyRead()),
this, SLOT(readyToRead()));
m_tcpSocket->connectToHost("localhost", 55555);
}
10
ТСР клиент. Пример
void Client::readyToRead(){
QDataStream in(m_tcpSocket);
in.setVersion(QDataStream::Qt_4_6);
if(m_tcpBlockSize == 0){
if(m_tcpSocket->bytesAvailable()> m_tcpBlockSize;
}
if(m_tcpSocket->bytesAvailable() < m_tcpBlockSize)
return;
QString greeting;
in >> greeting;
doSomething(greeting);
m_tcpBlockSize = 0;
}
11
UDP сокет
● класс QUdpSocket
○ используются как клиентами так и сервером
○ UDP - User Datagram Protocol
● Датаграмма - блок данных, пересылаемый
за один раз
○
○
○
○
с большими объемами могут быть проблемы
данные могут дойти, а могут и нет
данные могут прийти в не том порядке
данные могут дублироваться
12
UDP сокет. Пример
void Server::initSocket()
{
udpSocket = new QUdpSocket(this);
udpSocket->bind(QHostAddress::LocalHost, 7755);
connect(udpSocket, SIGNAL(readyRead()),
this, SLOT(readPendingDatagrams()));
}
void Server::readPendingDatagrams()
{
while (udpSocket->hasPendingDatagrams()) {
QNetworkDatagram datagram = udpSocket->receiveDatagram();
processTheDatagram(datagram);
}
}
13
WEB сокеты
#include
QT += websockets
● Клиент- серверное взаимодействие по протоколу
WebSocket
○ ws://host:port
● Передача данных в реальном времени
● Небольшой объем данных
● на основе TCP cокетов
○ QWebSocketServer – QTcpServer
○ QWebSocket – QTcpSocket
14
WEB сокеты . Подключение
#include
QT += websockets
15
SSL сокеты
● шифрование поверх ТСР-сокета
● поддерживает протоколы SSL 3 and TLS 1.2.
Установка зашифрованного соединения
● сразу - при создании совета
● отложенное - после установки соединения в
не зашифрованном режиме
16
SSL сокеты . Использование
● создать объект QSslSocket
○
QSslSocket *socket = new QSslSocket(this);
connect(socket, SIGNAL(encrypted()), this, SLOT(ready()));
● создать безопасное соединение
○
socket->connectToHostEncrypted("imap.example.com", 993)
● записать данные в сокет
17
SSL сокеты . Использование
● создать объект QSslSocket для входящего
соединения
● установить зашифрованный канал
void SslServer::incomingConnection(qintptr socketDescriptor){
QSslSocket *serverSocket = new QSslSocket;
if (serverSocket->setSocketDescriptor(socketDescriptor)) {
addPendingConnection(serverSocket);
connect(serverSocket, &QSslSocket::encrypted, this, &SslServer::ready);
serverSocket->startServerEncryption();
} else {
delete serverSocket;
}
}
18
Протоколы вы сокого уровня
●
●
●
●
●
HTTP, FTP
○ класс QHttp, QFtp
○ рекомендуется использовать QNetworkAccessManager
Создать объект QNetworkAccessManager
Вызвать нужную функцию (get(), post(), head(), post()) и передать в нее объект
QNetworkRequest содержащий адрес URL
Получить ответ в объекте QNetworkReply
Если нужно настроить прокси сервер ( setProxy()) и временные файлы
(setCookieJar())
19
Пример. Скачивание файла
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(downloadDone(QNetworkReply*)));
manager->get(
QNetworkRequest(QUrl("http://doc.qt.io/images/logo.png")));
MyClass::downloadDone(QNetworkReply *reply)
{
QImageReader reader(reply, "png");
mImage = reader.read());
emit imageChanged(mImage);
reply->deleteLater();
}
20
Запросы
● класс QNetworkRequest - запрос
○ экземпляр передается в методы
QNetworkAccessManager
○ используют QUrl в качестве аргумента
○ SSL - setSSLConfiguration()
○ Настройка заголовков
■ setHeader(KnownHeaders headerName, QVariant
headerValue)
■ setRawHeader(QByteArray headerName, QByteArray
headerValue
21
Ответы
● класс QNetworkReply - ответ
○ методы QNetworkAccessManager асинхронные
○ возвращают экземпляр QNetworkReply
○ Сигналы завершения выполнения операции
■ QNetworkReply::finished()
■ QNetworkAccessManager::finished(QNetworkReply*)
○ Состояние
■ downloadProgress(qint64, qint64)
■ uploadProgress()
○ Ошибки - error(NetworkError)
22
Структура адреса URL
● класс QUrl
QUrl url("ftp://ftp.qt.nokia.com/qt/sources/README");
QString host = url.host();
QString path = url.path();
23
Резюме
● Qt Network предоставляет классы для работы с сетью
○ UDP сокеты
○ TCP сокеты
○ SSL сокеты
○ средства разрешения адресов (host resolving)
● для HTTP и FTP следует использовать QNetworkAccessManager
○ QHttp и QFtp еще поддерживаются в Qt5 как дополнительные
модуль
● QNetworkAccessManager можно использовать для любых типов
сетевых запросов и обработки ответов
24