[Qt 개발과정] 네트워크 프로그래밍 : 'HTTP'와 'FTP'의 고급 네트워크 운영

개요

Qt Network모듈은 클라이언트와 서버를 작성하기 위한 클래스TCP/IP를 제공합니다. 낮은 수준의 네트워크 개념을 표현하기 위해 QTcpSocket, QTcpServerQUdpSocket와 같은 하위 수준 클래스도 제공합니다. QNetworkRequest, QNetworkReplyQNetworkAccessManager과 같은 상위 수준 클래스는 공통 프로토콜을 사용하여 네트워크 작업을 수행합니다. 또한 베어러 관리를 구현하는 QNetworkConfiguration, QNetworkConfigurationManager, QNetworkSession 등의 클래스도 제공합니다.

HTTPFTP에 대한 고급 네트워크 작업

网络访问API은 일반적인 네트워크 작업을 수행하는 데 사용되는 클래스 모음입니다. API사용되는 특정 작업 및 프로토콜에 대한 추상화 계층을 제공합니다(예: HTTP를 통해 데이터 가져오기 및 게시). 개발자는 이 계층이 제공하는 클래스만 사용하면 됩니다. 함수나 신호는 기본 구현이 어떻게 구현되는지 알지 못해도 작업을 완료할 수 있습니다.
네트워크 요청은 QNetworkRequest 클래스로 표시되며, 이 클래스는 사용된 헤더 정보 및 암호화 등 요청과 관련된 정보에 대한 일반 컨테이너 역할도 합니다. 요청 객체를 생성할 때 지정된 URL는 요청에 사용되는 프로토콜을 결정합니다. 현재 HTTP, FTP本地文件url 업로드 및 다운로드가 지원됩니다.
네트워크 작업 조정은 QNetworkAccessManager 클래스에 의해 수행됩니다. 요청이 생성되면 이 클래스를 사용하여 요청을 전달하고 신호를 내보내 진행 상황을 보고합니다. 관리자는 또한cookie클라이언트의 데이터 저장 사용, 인증 요청 및 프록시 사용을 조정합니다.
네트워크 요청에 대한 응답은 QNetworkReply 클래스로 표시되며, 요청이 전달될 때 QNetworkAccessManager 생성됩니다. QNetworkReply제공된 신호를 사용하여 각 답변을 개별적으로 모니터링할 수 있습니다. 또는 개발자는 대신 이 목적으로 관리자의 신호를 사용하도록 선택하고 답변에 대한 참조를 삭제할 수 있습니다. QNetworkReplyQIODevice의 하위 클래스이므로 응답은 동기식 또는 비동기식으로, 즉 차단 또는 비차단 작업으로 처리될 수 있습니다.
각 애플리케이션이나 라이브러리는 하나 이상의 QNetworkAccessManager 인스턴스를 생성하여 네트워크 통신을 처리할 수 있습니다.

HTTP

HTTP(Hypertext Transfer Protocol)는 HTML과 같은 하이퍼미디어 문서를 전송하는 데 사용되는 프로토콜입니다. 웹 브라우저와 웹 서버 간에 통신하는 클라이언트-서버 프로토콜입니다.

HTTP의 기본 작동 원리는 클라이언트가 서버에 요청을 보내고, 서버가 요청을 처리한 후 클라이언트에 응답을 보내는 것입니다. 요청 및 응답의 콘텐츠는 요청 줄, 요청 헤더, 요청 본문(요청 내)뿐만 아니라 상태 줄, 응답 헤더, 응답 본문(응답 내)을 포함한 일련의 메시지로 구성됩니다.

HTTP 통신은 상태 비저장입니다. 즉, 각 요청은 독립적이며 서버는 서로 다른 요청 간의 상태 정보를 유지하지 않습니다. 이 문제를 해결하기 위해 HTTP는 CookieSession와 같은 몇 가지 메커니즘을 도입하여 서로 다른 요청 간에 상태 정보를 공유했습니다.

HTTP에는 여러 버전이 있으며 가장 일반적으로 사용되는 버전은HTTP/1.1입니다. 지속적인 연결, 전송 압축, 청크 전송 인코딩 등의 기능을 지원하여 전송 효율성을 향상시킬 수 있습니다. 최신 버전은 HTTP/2이며 바이너리 프로토콜 및 멀티플렉싱과 같은 새로운 기능이 도입되었습니다.

하이퍼미디어 문서 전송 외에도 HTTP는 API 호출, 파일 업로드 및 다운로드 등과 같은 다른 목적으로도 사용될 수 있습니다.
여기에 이미지 설명을 삽입하세요.
다음은 네트워크 액세스 인터페이스를 통한 HTTP 통신의 예입니다.
.pro 추가:

QT       +=  network

헤더 파일에서 슬롯을 생성QNetworkAccessManager하고 선언replyFinished(QNetworkReply* reply)합니다.

#include <QMainWindow>

#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkAccessManager>

namespace Ui {
    
    
class MainWindow;
}

class MainWindow : public QMainWindow
{
    
    
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void replyFinished(QNetworkReply* reply);

private:
    Ui::MainWindow *ui;

    QNetworkAccessManager* m_pAceessManager;
};

소스 파일에서 슬롯을 초기화하고 구현합니다.

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    
    
    ui->setupUi(this);
    m_pAceessManager = new QNetworkAccessManager(this);
    // 当get完成时,进入replyFinished函数
    connect(m_pAceessManager, &QNetworkAccessManager::finished, this, &MainWindow::replyFinished);

    m_pAceessManager->get(QNetworkRequest(QUrl("http://httpbin.org/")));
}

MainWindow::~MainWindow()
{
    
    
    delete ui;
}

void MainWindow::replyFinished(QNetworkReply *reply)
{
    
    
    ui->textBrowser->setText(QString(reply->readAll()));
    reply->deleteLater();
}

실행 후 화면은 다음과 같습니다.
여기에 이미지 설명을 삽입하세요.
get() 기능 외에도 관리자는 http post 요청. /span>기능. 요청됨기능, 요청됨post()기능, http putput()http deletedeleteResource()

파일 다운로드 구현 및 진행 상황 표시 예시

  1. 먼저 UI입니다
    여기에 이미지 설명을 삽입하세요.
  2. 헤더 파일에 다음 슬롯 함수를 추가하세요.
	// 连接QNetworkReply的finished信号
    void slot_httpFinished();
    // 连接QNetworkReply的readyRead信号
    void slot_httpReadyRead();
    // 连接QNetworkReply的updateDataReadProgress信号
    void slot_updataProgress(qint64, qint64);
    // 下载按钮槽函数
    void on_btn_download_clicked();
  1. 헤더 파일에 다음 비공개 함수와 멤버 변수를 추가합니다.
private:
	// 开始请求
    void startRequest(const QUrl& url);

    QNetworkAccessManager* m_pAceessManager; // 网络访问管理
    QNetworkReply*  m_pReply; // 回复
    QFile*  m_pFile; // 文件指针
    QUrl m_url; // url
  1. 생성자에서 초기화됨
    m_pAceessManager = new QNetworkAccessManager(this);

    ui->progressBar->setValue(0);
  1. 위의 슬롯 함수와 전용 멤버 함수를 구현합니다.

void MainWindow::startRequest(const QUrl &url)
{
    
    
    m_pReply = m_pAceessManager->get(QNetworkRequest(url));
    connect(m_pReply, &QNetworkReply::readyRead, this, &MainWindow::slot_httpReadyRead);
    connect(m_pReply, &QNetworkReply::downloadProgress, this, &MainWindow::slot_updataProgress);
    connect(m_pReply, &QNetworkReply::finished, this, &MainWindow::slot_httpFinished);
}


void MainWindow::on_btn_download_clicked()
{
    
    
    m_url = ui->lineEdit->text();

    QFileInfo fileInfo(m_url.path());
    QString fileName(fileInfo.fileName());
    if(fileName.isEmpty())
    {
    
    
        fileName = "helloworld.html";
    }
    m_pFile = new QFile(fileName);
    if(m_pFile->open(QIODevice::WriteOnly))
    {
    
    
        startRequest(m_url);
    }
}

void MainWindow::slot_httpFinished()
{
    
    
    if(m_pFile)
    {
    
    
        m_pFile->close();
        m_pFile->deleteLater();
        m_pFile = nullptr;
    }
    m_pReply->deleteLater();
    m_pReply = nullptr;
}

void MainWindow::slot_httpReadyRead()
{
    
    
    if(m_pFile)
    {
    
    
        m_pFile->write(m_pReply->readAll());
    }
}

void MainWindow::slot_updataProgress(qint64 readSize, qint64 totalBytes)
{
    
    
    ui->progressBar->setMaximum(totalBytes);
    ui->progressBar->setValue(readSize);
}

프로그램을 실행하고 다운로드를 클릭하세요
여기에 이미지 설명을 삽입하세요.
화면은 다음과 같습니다:
여기에 이미지 설명을 삽입하세요.

FTP

FTP 프로토콜(파일 전송 프로토콜)은 컴퓨터 네트워크에서 파일 전송에 사용되는 표준 프로토콜 중 하나입니다. 이를 통해 사용자는 TCP/IP 네트워크를 통해 한 컴퓨터에서 다른 컴퓨터로 파일을 전송할 수 있습니다. FTP 프로토콜은 제어 연결과 데이터 전송 연결의 두 부분으로 구성됩니다.

제어 연결은 사용자 인증, 파일 디렉터리 검색 및 파일 작업을 포함하여 명령과 응답 간의 통신에 사용됩니다. 제어 연결은 기본 포트 번호 21을 사용합니다.

데이터 전송 연결은 실제 파일 전송에 사용됩니다. FTP 프로토콜에는 활성 모드와 수동 모드의 두 가지 데이터 전송 모드가 있습니다. 활성 모드에서는 서버가 포트 20에서 데이터 연결을 시작하고 클라이언트는 상위 포트에서 연결을 기다립니다. 패시브 모드에서는 서버가 높은 포트에서 연결을 기다리는 반면 클라이언트는 포트 20에서 데이터 연결을 시작합니다.

FTP 프로토콜은 Windows, Linux 및 macOS를 포함한 대부분의 운영 체제를 지원합니다. 파일 업로드 및 다운로드, 파일 이름 바꾸기, 파일 삭제 등과 같은 많은 기능을 제공합니다. 또한 FTP 프로토콜은 익명 로그인도 지원하므로 사용자는 익명 ID를 사용하여 공용 FTP 서버의 파일에 액세스할 수 있습니다.

그러나 FTP 프로토콜은 보안이 취약하고 데이터 유출 및 악의적인 공격에 취약하므로 일반적으로 SFTP(SSH 파일 전송 프로토콜) 또는 FTPS(SSL/TLS를 통한 FTP)와 같은 보다 안전한 프로토콜을 사용하는 것이 좋습니다. 이러한 프로토콜은 FTP 프로토콜에 암호화 및 인증과 같은 보안 기능을 추가하여 보다 안정적인 파일 전송을 제공합니다.
여기에 이미지 설명을 삽입하세요.

추천

출처blog.csdn.net/MrHHHHHH/article/details/134984665