Κοινή χρήση τεχνολογίας

Προγραμματισμός δικτύου Qt http

2024-07-12

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

Μαθησιακοί στόχοι: Προγραμματισμός δικτύου Qt HTTP

Μαθησιακό Περιεχόμενο

1. Το Http είναι η συντομογραφία του Hypertext Transfer Protocol, το οποίο καθορίζει τις προδιαγραφές επικοινωνίας μεταξύ προγραμμάτων περιήγησης και διακομιστών Ιστού. Είναι ένα απλό πρωτόκολλο αίτησης-απόκρισης που συνήθως τρέχει πάνω από το TCP.

Λειτουργία: Καθορίζει τις προδιαγραφές μεταφοράς πληροφοριών μεταξύ του διακομιστή WWW και του προγράμματος περιήγησης και είναι μια συμφωνία που τηρούν και τα δύο μέρη.
2.Πώς λειτουργεί το http: Το HTTP βασίζεται στο μοντέλο πελάτη/διακομιστή και είναι προσανατολισμένο στη σύνδεση. Διαδικασία συναλλαγής HTTP

  1. Ο πελάτης δημιουργεί μια σύνδεση με τον διακομιστή.
  2. Ο πελάτης κάνει ένα αίτημα στον διακομιστή.
  3. Ο διακομιστής αποδέχεται το αίτημα και επιστρέφει το αντίστοιχο αρχείο ως απάντηση σύμφωνα με το αίτημα:
  4. Ο πελάτης και ο διακομιστής κλείνουν τη σύνδεση.

Το Qt υλοποιεί λειτουργίες HTTP με δύο τρόπους

1. Χρησιμοποιήστε τις κλάσεις QNetworkAccessManager και QNetworkReply:

  1. - Το QNetworkAccessManager είναι ο διαχειριστής πρόσβασης δικτύου της Qt, υπεύθυνος για την αποστολή και λήψη αιτημάτων HTTP/HTTPS.
  2. - Εκκινήστε GET/POST και άλλα αιτήματα μέσω του QNetworkAccessManager::get/post, κ.λπ. και επιστρέψτε αντικείμενα QNetworkReply.
  3. - Λάβετε κωδικό απάντησης, πληροφορίες κεφαλίδας, περιεχόμενο κ.λπ. από το QNetworkReply. Υλοποίηση σύγχρονων και ασύγχρονων αιτημάτων.

2. Χρησιμοποιήστε κλάσεις QHttpEngine και QHttpNetworkRequest/Reply (κατώτερο επίπεδο):

  1. - Το QHttpEngine είναι υπεύθυνο για τη διαχείριση των συνδέσεων HTTP και την επεξεργασία αιτημάτων.
  2. - Χρησιμοποιήστε το QHttpNetworkRequest για να δημιουργήσετε το αίτημα και να το στείλετε μέσω του QHttpEngine.
  3. - Αναλύστε το QHttpNetworkReply που επιστράφηκε για να λάβετε την απάντηση.

Σε γενικές γραμμές, για απλές λειτουργίες HTTP, αρκεί η χρήση της διεπαφής υψηλού επιπέδου QNetworkAccessManager. Χειρίζεται κοινές ανάγκες άνετα.

Εάν χρειάζεστε έλεγχο χαμηλότερου επιπέδου, όπως προσαρμογή της μηχανής HTTP ή λεπτομέρειες αιτήματος/απόκρισης, μπορείτε να χρησιμοποιήσετε κατηγορίες χαμηλού επιπέδου, όπως το QHttpEngine.

Εν ολίγοις, το Qt παρέχει μια πλήρη εφαρμογή πελάτη HTTP και οι προγραμματιστές μπορούν να επιλέξουν μια πιο κατάλληλη διεπαφή για λειτουργίες επικοινωνίας δικτύου με βάση τις πραγματικές ανάγκες. Αυτό παρέχει καλή υποστήριξη για την ανάπτυξη εφαρμογών Qt.

Συνοψίζω:

Ο πρώτος τύπος: Διαχείριση σύνδεσης δικτύου QNetworkAccessManager, 2 ενέργειες: λήψη/ανάρτηση για λήψη ή υποβολή αιτήματος και επιστροφή του αντικειμένου QNetworkReply που περιέχει διάφορες πληροφορίες σύνδεσης.

Ο δεύτερος τύπος: Το QHttpEngine διαχειρίζεται μόνο αιτήματα σύνδεσης και δεν είναι υπεύθυνο για την αποστολή τους.

  • Χρησιμοποιήστε το QHttpNetworkRequest για να δημιουργήσετε το αίτημα και να το στείλετε μέσω του QHttpEngine.

  • Αναλύστε το QHttpNetworkReply που επιστράφηκε για να λάβετε την απάντηση.

Εφέ έργου και βασικός κώδικας

http αναγνώστης

διακομιστή http

πυρήνα κώδικα

http αναγνώστης

  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

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

 

Συνοψίζω

Το http είναι ένα πρωτόκολλο επιπέδου εφαρμογής που βασίζεται στο tcp, επομένως θα χρησιμοποιηθούν κλάσεις tcp και η ενθυλάκωση πρωτοκόλλου έχει διορθωθεί.Σχεδιασμός λειτουργίας κύριου μέλους

  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 είναι οι QNetworkAccessManager, QNetworkRequest και QNetworkReply.

QNetworkAccessManager:

  • Διαχειριστείτε τις συνδέσεις και τα αιτήματα στο δίκτυο. Αποστολή και λήψη δεδομένων.

  • Παρέχει προηγμένες συναρτήσεις όπως get(), post() και put() για την εκκίνηση αιτημάτων HTTP.

  • Σήματα: finished(), authenticationRequired()等.

QNetworkRequest:

  • Αντιπροσωπεύει ένα αίτημα HTTP. Περιέχει χαρακτηριστικά όπως URL και κεφαλίδες.

  • Ορίστε τη μέθοδο αιτήματος, τον τύπο περιεχομένου, τις πληροφορίες κεφαλίδας κ.λπ.

QNetworkReply:

  • Αντιπροσωπεύει μια απόκριση HTTP. Επιστροφή κωδικού κατάστασης και περιεχομένου.

  • Σήματα: downloadProgress(), error(), κ.λπ. ειδοποιούν τα αποτελέσματα επεξεργασίας.

  • Λειτουργικές συναρτήσεις όπως το readAll() διαβάζουν το περιεχόμενο της απάντησης.

Κύρια βήματα:

  1. Δημιουργήστε μια παρουσία αντικειμένου QNetworkAccessManager.

  2. Δημιουργήστε ένα αντικείμενο QNetworkRequest για να ορίσετε τη διεύθυνση URL και τις ιδιότητες.

  3. Καλέστε λειτουργίες όπως QNetworkAccessManager::get() ή post() για να υποβάλετε ένα αίτημα.

  4. Ακούστε τα σήματα του QNetworkReply για να λάβετε τα αποτελέσματα.

  5. Διαβάστε περιεχόμενο μέσω του QNetworkReply ή χειριστείτε σφάλματα.

  6. Αφαιρέστε το QNetworkReply και ζητήστε αντικείμενα για να αποτρέψετε διαρροές μνήμης.

Τέλος, επισυνάψτε τον σύνδεσμο πηγαίου κώδικα
Εάν σας βοηθάει, δώστε μου ένα αστέρι

Επίδειξη Qt: διαδικασία εκμάθησης qt (gitee.com)