Teknologian jakaminen

Qt http verkkoohjelmointi

2024-07-12

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

Oppimistavoitteet: Qt HTTP -verkkoohjelmointi

Oppimissisältö

1. Http on lyhenne sanoista Hypertext Transfer Protocol, joka määrittää selainten ja web-palvelimien väliset viestintävaatimukset. Se on yksinkertainen pyyntö-vastausprotokolla, joka yleensä toimii TCP:n päällä.

Toiminta: Se määrittelee WWW-palvelimen ja selaimen väliset tiedonsiirtovaatimukset ja on sopimus, jota molemmat osapuolet noudattavat.
2.Miten http toimii: HTTP perustuu asiakas/palvelin-malliin ja on yhteyssuuntautunut. HTTP-tapahtumaprosessi

  1. Asiakas muodostaa yhteyden palvelimeen;
  2. Asiakas tekee pyynnön palvelimelle;
  3. Palvelin hyväksyy pyynnön ja palauttaa vastaavan tiedoston vastauksena pyynnön mukaisesti:
  4. Asiakas ja palvelin sulkevat yhteyden.

Qt toteuttaa HTTP-toiminnot kahdella tavalla

1. Käytä QNetworkAccessManager- ja QNetworkReply-luokkia:

  1. - QNetworkAccessManager on Qt:n verkkokäyttöpäällikkö, joka vastaa HTTP/HTTPS-pyyntöjen lähettämisestä ja vastaanottamisesta.
  2. - Aloita GET/POST ja muut pyynnöt QNetworkAccessManager::get/post jne. kautta ja palauta QNetworkReply-objektit.
  3. - Hanki vastauskoodi, otsikkotiedot, sisältö jne. QNetworkReplystä. Toteuta synkronisia ja asynkronisia pyyntöjä.

2. Käytä QHttpEngine- ja QHttpNetworkRequest/Reply-luokkia (alempi taso):

  1. - QHttpEngine vastaa HTTP-yhteyksien hallinnasta ja pyyntöjen käsittelystä.
  2. - Käytä QHttpNetworkRequest-sovellusta pyynnön rakentamiseen ja lähetä se QHttpEnginen kautta.
  3. - Jäsennä palautettu QHttpNetworkReply saadaksesi vastauksen.

Yleisesti ottaen yksinkertaisiin HTTP-toimintoihin riittää korkean tason QNetworkAccessManager-liittymän käyttö. Se hoitaa yleiset tarpeet kätevästi.

Jos tarvitset alemman tason ohjausta, kuten HTTP-moottorin mukauttamista tai pyyntö-/vastaustietoja, voit käyttää matalan tason luokkia, kuten QHttpEngine.

Lyhyesti sanottuna Qt tarjoaa täydellisen HTTP-asiakastoteutuksen, ja kehittäjät voivat valita sopivamman rajapinnan verkkoviestintätoimintoihin todellisten tarpeiden perusteella. Tämä tarjoaa hyvän tuen Qt-sovellusten kehittämiselle.

Yhteenveto:

Ensimmäinen tyyppi: QNetworkAccessManager-verkkoyhteydenhallinta, 2 toimintoa: get/post pyynnön saamiseksi tai lähettämiseksi ja paluuobjekti QNetworkReply, joka sisältää erilaisia ​​yhteystietoja.

Toinen tyyppi: QHttpEngine hallitsee vain yhteyspyyntöjä eikä ole vastuussa niiden lähettämisestä.

  • Käytä QHttpNetworkRequest-sovellusta pyynnön rakentamiseen ja lähetä se QHttpEnginen kautta.

  • Jäsennä palautettu QHttpNetworkReply saadaksesi vastauksen.

Projektiefektit ja ydinkoodi

http-lukija

http-palvelin

ydinkoodi

http-lukija

  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-palvelin

  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. }

 

Tee yhteenveto

http on tcp-pohjainen sovelluskerroksen protokolla, joten tcp-luokkia käytetään ja protokollan kapselointi on kiinteä.Pääjäsenen toimintojen suunnittelu

  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页面内容作为响应体

 

Qt HTTP -ohjelmoinnin pääluokat ovat QNetworkAccessManager, QNetworkRequest ja QNetworkReply.

QNetworkAccessManager:

  • Hallitse yhteyksiä ja pyyntöjä verkkoon. Lähetä ja vastaanota tietoja.

  • Tarjoaa edistyneitä toimintoja, kuten get(), post() ja put() HTTP-pyyntöjen aloittamiseen.

  • Signaalit: valmis(), todennus vaaditaan()等.

QNetworkRequest:

  • Edustaa HTTP-pyyntöä. Sisältää attribuutteja, kuten URL-osoite, otsikot jne.

  • Aseta pyyntömenetelmä, sisältötyyppi, otsikkotiedot jne.

QNetworkReply:

  • Edustaa HTTP-vastausta. Palauta tilakoodi ja sisältö.

  • Signaalit: downloadProgress(), error() jne. ilmoittavat käsittelyn tuloksista.

  • Toiminnalliset funktiot, kuten readAll() lukevat vastauksen sisällön.

Päävaiheet:

  1. Luo QNetworkAccessManager-objekti-ilmentymä.

  2. Luo QNetworkRequest-objekti URL-osoitteen ja ominaisuuksien määrittämiseksi.

  3. Tee pyyntö kutsumalla toimintoja, kuten QNetworkAccessManager::get() tai post().

  4. Kuuntele QNetworkReplyn signaaleja saadaksesi tulokset.

  5. Lue sisältöä QNetworkReplyn kautta tai käsittele virheitä.

  6. Poista QNetworkReply ja pyydä objekteja muistivuotojen estämiseksi.

Liitä lopuksi lähdekoodilinkki
Jos siitä on sinulle hyötyä, anna minulle tähti

Qt-demo: qt-prosessin oppiminen (gitee.com)