Technology sharing

Qt http network programming

2024-07-12

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

Discendi proposita: Qt HTTP network programming

Learning Content

1. Http est abbreviatio translationis Protocollum Hypertexta, quae definit speciem communicationis inter navigatores et interretiales ministratores. Simplex postulatio responsionis protocollum est quod super TCP currit solet.

Munus: Certus informationes translationis specificationum inter WWW server et pasco, et est pactum quod utraque pars stare debet.
2.Quomodo http operatur: HTTP fundatur in cliente/servo exemplar et nexus ordinatur. HTTP transaction processus

  1. Cliens nexum cum servo constituit;
  2. Cliens petit servo;
  3. Servus petitionem accipit et tabellam respondens respondet iuxta petitionem:
  4. Cliens et servulus nexum claudunt.

Qt instrumentis operationibus HTTP duobus modis

1. usus QNetworkAccessManager et QNetworkReply classes:

  1. - QNetworkAccessManager est Qt procurator retis accessus, responsalis petitionum mittendi et recipiendi HTTP/HTTPS.
  2. - Initiate GET/post et alias petitiones per QNetworkAccessManager::adepto/post, etc., et obiecti QNetworkReply return.
  3. - Habe responsionem codicem, caput informationes, content, etc. e QNetworkReply. Exsequendam synchronam et asynchronam petitiones.

2. Usus QHttpEngine et QHttpNetworkRequest/Responsio classes (inferiore gradu);

  1. - QHttpEngine responsabilis est nexus HTTP administrandi et petitiones processus.
  2. - Utere QHttpNetworkRequest ad petitionem aedificare et mitte per QHttpEngine.
  3. - Parse QHttpNetworkReply redditum ut responsum acciperet.

Generaliter, ad simplices operationes HTTP, utens summus gradus QNetworkAccessManager instrumenti satis est. Ei commodo commune tractatos necessitatibus mea.

Si potestate inferioris gradus indigere, ut mos HTTP machinae vel rogationis / responsionis singula, uti potes in humili gradu generum quali QHttpEngine.

In summa, Qt praebet exsecutionem clientis HTTP integram, et tincidunt commodiorem interfaciem eligere possunt ad operationes communicationis network secundum actuales necessitates. Hoc bonum subsidium praebet ad applicationes Qt explicandas.

Summatim:

Primum genus: QNetworkAccessManager network iunctio procurator, 2 actiones: impetra/post impetrandi vel petitioni subiciendi, et redde obiectum QNetworkReply quod varias nexus notitias continet.

Secundum genus: QHttpEngine tantum petit nexum administrat nec responsalis ad illas mittendas.

  • Utere QHttpNetworkRequest ut aedificare rogationem et mitte per QHttpEngine.

  • Parse QHttpNetworkReply redditum ut responsum acciperet.

Project effectus et core codice

http lectorem

http server

core codice

http lectorem

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

 

Summatim

http est applicatio tabulatorum protocollo in tcp fundata, sic tcp classes adhibebuntur, et protocollo encapsulation fixa est.Praecipuum membrum munus design

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

 

Praecipuae classes pro Qt HTTP programmandi sunt QNetworkAccessManager, QNetworkRequest et QNetworkReply.

QNetworkAccessManager:

  • Administrare nexus et petitiones ad ornatum. Mitte ac data.

  • Munera provecta praebet ut adepto(), post(), et pone() ut petitiones HTTP incipiant.

  • Annuit: complevit () authenticationRequired ()

QNetworkRequest:

  • HTTP repraesentat petitionem. URL et capitis attributa continet.

  • Petendi modum pone, genus contentus, informationes header, etc.

QNetworkReply:

  • HTTP responsio repraesentat. Redi status codicem et contentus.

  • Signis: downloadProgress(), error(), etc. certiorem processui proventus.

  • Functiones functiones sicut All () legunt responsum contentum.

Principalis gradus:

  1. Facere QNetworkAccessManager rem puta.

  2. Facere obiectum QNetworkRequest ut Domicilium et proprietates instituat.

  3. Munera voca ut QNetworkAccessManager ::adepto() vel post() rogandum.

  4. Audi signa QNetworkReply ut consequitur.

  5. Lege contentum per QNetworkReply, vel errores tractare.

  6. Remove QNetworkReply et petentibus obiecta ne memoria pinum.

Denique adnectunt fontem codicem nexum
Si tibi prodest, da mihi stellam

Qt demo: doctrina qt processus (gitee.com)