Technologieaustausch

Qt http-Netzwerkprogrammierung

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Lernziele: Qt HTTP-Netzwerkprogrammierung

Lerninhalte

1. Http ist die Abkürzung für Hypertext Transfer Protocol, das die Kommunikationsspezifikationen zwischen Browsern und Webservern definiert. Es handelt sich um ein einfaches Request-Response-Protokoll, das normalerweise auf TCP läuft.

Funktion: Es legt die Spezifikationen für die Informationsübertragung zwischen dem WWW-Server und dem Browser fest und ist eine Vereinbarung, die beide Parteien einhalten müssen.
2.So funktioniert http: HTTP basiert auf dem Client/Server-Modell und ist verbindungsorientiert. HTTP-Transaktionsprozess

  1. Der Client stellt eine Verbindung mit dem Server her;
  2. Der Client stellt eine Anfrage an den Server.
  3. Der Server nimmt die Anfrage an und gibt entsprechend der Anfrage die entsprechende Datei als Antwort zurück:
  4. Client und Server schließen die Verbindung.

Qt implementiert HTTP-Operationen auf zwei Arten

1. Verwenden Sie die Klassen QNetworkAccessManager und QNetworkReply:

  1. - QNetworkAccessManager ist der Netzwerkzugriffsmanager von Qt, der für das Senden und Empfangen von HTTP/HTTPS-Anfragen verantwortlich ist.
  2. - Initiieren Sie GET/POST und andere Anforderungen über QNetworkAccessManager::get/post usw. und geben Sie QNetworkReply-Objekte zurück.
  3. - Erhalten Sie Antwortcode, Header-Informationen, Inhalte usw. von QNetworkReply. Implementieren Sie synchrone und asynchrone Anfragen.

2. Verwenden Sie die Klassen QHttpEngine und QHttpNetworkRequest/Reply (untere Ebene):

  1. - QHttpEngine ist für die Verwaltung von HTTP-Verbindungen und die Verarbeitung von Anfragen verantwortlich.
  2. - Verwenden Sie QHttpNetworkRequest, um die Anfrage zu erstellen und über QHttpEngine zu senden.
  3. – Analysieren Sie die zurückgegebene QHttpNetworkReply, um die Antwort zu erhalten.

Im Allgemeinen ist für einfache HTTP-Vorgänge die Verwendung der übergeordneten QNetworkAccessManager-Schnittstelle ausreichend. Es erfüllt allgemeine Anforderungen bequem.

Wenn Sie eine Steuerung auf niedrigerer Ebene benötigen, z. B. das Anpassen der HTTP-Engine oder der Anforderungs-/Antwortdetails, können Sie Klassen auf niedriger Ebene wie QHttpEngine verwenden.

Kurz gesagt, Qt bietet eine vollständige HTTP-Client-Implementierung, und Entwickler können basierend auf den tatsächlichen Anforderungen eine geeignetere Schnittstelle für Netzwerkkommunikationsvorgänge auswählen. Dies bietet eine gute Unterstützung für die Entwicklung von Qt-Anwendungen.

Zusammenfassen:

Der erste Typ: QNetworkAccessManager, Netzwerkverbindungsmanager, 2 Aktionen: Get/Post zum Abrufen oder Senden einer Anforderung und Zurückgeben des Objekts QNetworkReply, das verschiedene Verbindungsinformationen enthält.

Der zweite Typ: QHttpEngine verwaltet nur Verbindungsanfragen und ist nicht für deren Versand verantwortlich.

  • Verwenden Sie QHttpNetworkRequest, um die Anfrage zu erstellen und über QHttpEngine zu senden.

  • Analysieren Sie die zurückgegebene QHttpNetworkReply, um die Antwort zu erhalten.

Projekteffekte und Kerncode

http-Reader

http-Server

Kerncode

http-Reader

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QtNetwork> // 提供编程TCP/IP客户端和服务器的类
  5. #include <QUrl> // 提供接口使用URLs
  6. QT_BEGIN_NAMESPACE
  7. namespace Ui { class MainWindow; }
  8. QT_END_NAMESPACE
  9. class MainWindow : public QMainWindow
  10. {
  11. Q_OBJECT
  12. public:
  13. MainWindow(QWidget *parent = nullptr);
  14. ~MainWindow();
  15. private slots:
  16. void on_pushButton_clicked();
  17. private:
  18. Ui::MainWindow *ui;
  19. QNetworkAccessManager* accesssMgr;
  20. };
  21. #endif // MAINWINDOW_H
  22. #include "mainwindow.h"
  23. #include "ui_mainwindow.h"
  24. MainWindow::MainWindow(QWidget *parent)
  25. : QMainWindow(parent)
  26. , ui(new Ui::MainWindow)
  27. {
  28. ui->setupUi(this);
  29. accesssMgr =new QNetworkAccessManager(this);
  30. QObject::connect(accesssMgr,QOverload<QNetworkReply*>::of(&QNetworkAccessManager::finished),this,
  31. [this](QNetworkReply* reply){
  32. QString read=reply->readAll();
  33. ui->textBrowser->setText(read);
  34. reply->deleteLater(); //释放
  35. });
  36. }
  37. MainWindow::~MainWindow()
  38. {
  39. delete ui;
  40. }
  41. void MainWindow::on_pushButton_clicked()
  42. {
  43. ui->label->setText("数据正在下载中,请耐心等待......");
  44. QString url=ui->textEdit->toPlainText();
  45. qDebug()<<url;
  46. accesssMgr->get(QNetworkRequest(QUrl(url)));
  47. }

http-Server

  1. #include "httpserver.h"
  2. HttpServer::HttpServer(QObject *parent) : QObject(parent)
  3. {
  4. server =new QTcpServer(this);
  5. //连接回调
  6. connect(server,&QTcpServer::newConnection,this,&HttpServer::MyselfNewConnectCalllSlot);
  7. //开始监听
  8. if(!server->listen(QHostAddress::Any,8088))
  9. {
  10. qDebug()<<"n致命错误:Web服务器没有启动,请重新检查!"<<endl;
  11. }
  12. else
  13. {
  14. qDebug()<<"n正常启动:Web服务器端口:8088,等待客户端连接......"<<endl;;
  15. }
  16. }
  17. void HttpServer::MyselfNewConnectCalllSlot(){
  18. socket = server->nextPendingConnection(); //获取连接
  19. while(!(socket->waitForReadyRead(100))); //等待套接字是否有可读数据。 一直阻塞线程等待,直到有可读数据到达套接字,或者超时返回。
  20. QString webdata;
  21. webdata.resize(1000);
  22. webdata=socket->read(1000);
  23. qDebug()<<"正常运行:从浏览器读取数据信息......"<<webdata;
  24. //封装http协议
  25. socket->write("HTTP/1.1 200 OKrn");
  26. socket->write("Content-Type: text/htmlrn");
  27. socket->write("Connection: closern");
  28. socket->write("Refresh: 3rnrn"); // 每秒刷新Web浏览器
  29. socket->write("<!DOCTYPE>"
  30. "<html>"
  31. "<header>"
  32. "<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>"
  33. "<title>HttpServer</title>"
  34. "</header>"
  35. "<body>客户端已经连接HttpSever服务器秒数为:");
  36. QByteArray byte;
  37. static qint16 icount=0;
  38. byte.setNum(icount++);
  39. socket->write(byte);
  40. socket->write("</html>");
  41. /*
  42. flush() 不会等待数据真正发送出去,只是把数据从本地缓冲区 flush 到内核缓冲区。
  43. 如果输出缓冲区没有数据,flush() 有可能不做任何操作。
  44. 调用 flush() 可以确保目前为止写到 socket 的所有数据都发送给对端,而不是 buffered 在本地。
  45. 一般在发送完请求或应答后调用,保证数据及时发送出去。
  46. */
  47. socket->flush(); //刷新 socket 对象的输出缓冲区。 并发送
  48. connect(socket, &QTcpSocket::disconnected, socket, &QTcpSocket::deleteLater);
  49. socket->disconnectFromHost();
  50. }

 

Zusammenfassen

http ist ein auf TCP basierendes Protokoll der Anwendungsschicht, daher werden TCP-Klassen verwendet und die Protokollkapselung ist festgelegt.Design der Hauptelementfunktion

  1. 请求:
  2. GET /index.html HTTP/1.1
  3. Host: www.example.com
  4. User-Agent: Mozilla/5.0...
  5. Accept: text/html
  6. 响应:
  7. HTTP/1.1 200 OK
  8. Date: Mon, 27 Jan 2020 08:12:31 GMT
  9. Server: Apache/2.4.1 (Unix)
  10. Last-Modified: Wed, 22 Jul 2020 19:15:56 GMT
  11. ETag: "49092-5b6-52c65aa32f280"
  12. Accept-Ranges: bytes
  13. Content-Length: 438
  14. Connection: close
  15. Content-Type: text/html; charset=UTF-8
  16. <html>
  17. <head>
  18. <title>Welcome to example.com!</title>
  19. </head>
  20. <body>
  21. <h1>Hello World!</h1>
  22. <p>This is the hello world page for an example website.</p>
  23. </body>
  24. </html>
  25. 这个示例演示了一个简单的HTTP请求和响应过程:
  26. 客户端发送GET请求获取index.html页面
  27. 服务器返回200状态码,表示请求成功
  28. 返回各种报头如日期、服务器信息等
  29. 返回HTML页面内容作为响应体

 

Die Hauptklassen für die Qt-HTTP-Programmierung sind QNetworkAccessManager, QNetworkRequest und QNetworkReply.

QNetworkAccessManager:

  • Verwalten Sie Verbindungen und Anfragen an das Netzwerk. Daten senden und empfangen.

  • Bietet erweiterte Funktionen wie get(), post() und put() zum Initiieren von HTTP-Anfragen.

  • Signale: fertig(), Authentifizierung erforderlich() usw.

QNetworkRequest:

  • Stellt eine HTTP-Anfrage dar. Enthält Attribute wie URL und Header.

  • Legen Sie die Anforderungsmethode, den Inhaltstyp, die Header-Informationen usw. fest.

QNetworkAntwort:

  • Stellt eine HTTP-Antwort dar. Statuscode und Inhalt zurückgeben.

  • Signale: downloadProgress(), error() usw. benachrichtigen Verarbeitungsergebnisse.

  • Funktionale Funktionen wie readAll() lesen den Antwortinhalt.

Hauptschritte:

  1. Erstellen Sie eine QNetworkAccessManager-Objektinstanz.

  2. Erstellen Sie ein QNetworkRequest-Objekt, um die URL und Eigenschaften festzulegen.

  3. Rufen Sie Funktionen wie QNetworkAccessManager::get() oder post() auf, um eine Anfrage zu stellen.

  4. Hören Sie sich die Signale von QNetworkReply an, um die Ergebnisse zu erhalten.

  5. Lesen Sie Inhalte über QNetworkReply oder behandeln Sie Fehler.

  6. Entfernen Sie QNetworkReply- und Anforderungsobjekte, um Speicherlecks zu verhindern.

Hängen Sie abschließend den Quellcode-Link an
Wenn es für Sie hilfreich ist, geben Sie mir bitte einen Stern

Qt-Demo: QT-Prozess lernen (gitee.com)