Compartir tecnología

Programación de red http Qt

2024-07-12

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

Objetivos de aprendizaje: programación de redes Qt HTTP

Contenido de aprendizaje

1. Http es la abreviatura de Protocolo de transferencia de hipertexto, que define las especificaciones de comunicación entre navegadores y servidores web. Es un protocolo de solicitud-respuesta simple que generalmente se ejecuta sobre TCP.

Función: Estipula las especificaciones de transferencia de información entre el servidor WWW y el navegador, y es un acuerdo que cumplen ambas partes.
2.Cómo funciona http: HTTP se basa en el modelo cliente/servidor y está orientado a la conexión. Flujo de procesamiento de transacciones HTTP

  1. El cliente establece una conexión con el servidor;
  2. El cliente realiza una solicitud al servidor;
  3. El servidor acepta la solicitud y devuelve el archivo correspondiente como respuesta según la solicitud:
  4. El cliente y el servidor cierran la conexión.

Qt implementa operaciones HTTP de dos maneras

1. Utilice las clases QNetworkAccessManager y QNetworkReply:

  1. - QNetworkAccessManager es el administrador de acceso a la red de Qt, responsable de enviar y recibir solicitudes HTTP/HTTPS.
  2. - Iniciar GET/POST y otras solicitudes a través de QNetworkAccessManager::get/post, etc., y devolver objetos QNetworkReply.
  3. - Obtener código de respuesta, información del encabezado, contenido, etc. de QNetworkReply. Implementar solicitudes sincrónicas y asincrónicas.

2. Utilice las clases QHttpEngine y QHttpNetworkRequest/Reply (nivel inferior):

  1. - QHttpEngine es responsable de gestionar las conexiones HTTP y procesar las solicitudes.
  2. - Utilice QHttpNetworkRequest para generar la solicitud y enviarla a través de QHttpEngine.
  3. - Analiza el QHttpNetworkReply devuelto para obtener la respuesta.

En términos generales, para operaciones HTTP simples, es suficiente utilizar la interfaz QNetworkAccessManager de alto nivel. Maneja las necesidades comunes cómodamente.

Si necesita control de nivel inferior, como personalizar el motor HTTP o los detalles de solicitud/respuesta, puede utilizar clases de bajo nivel como QHttpEngine.

En resumen, Qt proporciona una implementación de cliente HTTP completa y los desarrolladores pueden elegir una interfaz más adecuada para las operaciones de comunicación de red según las necesidades reales. Esto proporciona un buen soporte para el desarrollo de aplicaciones Qt.

Resumir:

El primer tipo: administrador de conexión de red QNetworkAccessManager, 2 acciones: obtener / publicar para obtener o enviar una solicitud, y el objeto devuelto QNetworkReply contiene diversa información de conexión.

El segundo tipo: QHttpEngine solo gestiona las solicitudes de conexión y no es responsable de enviarlas.

  • Utilice QHttpNetworkRequest para crear la solicitud y enviarla a través de QHttpEngine.

  • Analice el QHttpNetworkReply devuelto para obtener la respuesta.

Efectos del proyecto y código central.

lector http

servidor http

código central

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

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

 

Resumir

http es un protocolo de capa de aplicación basado en tcp, por lo que se utilizarán clases tcp y la encapsulación del protocolo es fija.Diseño de función miembro principal.

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

 

Las clases principales para la programación Qt HTTP son QNetworkAccessManager, QNetworkRequest y QNetworkReply.

Administrador de acceso a la red Q:

  • Gestionar conexiones y solicitudes a la red. Enviar y recibir datos.

  • Proporciona funciones avanzadas como get(), post() y put() para iniciar solicitudes HTTP.

  • Señales: finished(), authenticationRequired()

Solicitud de red Q:

  • Representa una solicitud HTTP. Contiene atributos como URL, encabezados, etc.

  • Establezca el método de solicitud, el tipo de contenido, la información del encabezado, etc.

Respuesta de QNetwork:

  • Representa una respuesta HTTP. Devolver código de estado y contenido.

  • Señales: downloadProgress(), error(), etc. notifican los resultados del procesamiento.

  • Funciones funcionales como readAll() leen el contenido de la respuesta.

Pasos principales:

  1. Cree una instancia de objeto QNetworkAccessManager.

  2. Cree un objeto QNetworkRequest para configurar la URL y las propiedades.

  3. Llame a funciones como QNetworkAccessManager::get() o post() para realizar una solicitud.

  4. Escuche las señales de QNetworkReply para obtener los resultados.

  5. Lea el contenido a través de QNetworkReply o maneje errores.

  6. Elimine QNetworkReply y solicite objetos para evitar pérdidas de memoria.

Finalmente, adjunte el enlace del código fuente.
Si te es útil por favor dame una estrella.

Demostración de Qt: aprendizaje del proceso qt (gitee.com)