QT HTTP协议编程

文章介绍了HTTP协议的基础知识,包括其工作原理和在Qt中如何使用QNetworkAccessManager进行HTTP请求,以及如何实现一个简单的HTTP服务器用QTcpServer来处理客户端连接。
摘要由CSDN通过智能技术生成

一、http协议基础知识

1、http:超文本传输协议是一个简单的请求,响应协议,它通常运行在TCP之上。作用,规定WWW服务器与浏览去之间信息传递规范,是二者共同遵守的协议,

2、http工作原理:HTTP是基于客户端、服务器模式,且面向连接的。HTTP事务处理有流程

   客户端与服务端建立连接;
    客户端与服务区提出请求
    服务器接受请求,并根据请求返回响应的文件作为应答
    客户与服务器关闭连接

二、HTTP协议项目

1、第一个项目

2、第二个项目

三、项目代码

1、第一个项目代码

 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtNetwork>//提供编程TCP/IP客户端和服务端的类
#include <QUrl> //提供接口使用URLs
class QNetwrokAcessManager;
class QNetworkReply;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    QNetworkAccessManager *mgr;
public slots:
    void replayFinishedFunc(QNetworkReply *);
private slots:
    void on_pushButton_clicked();
};
#endif // MAINWINDOW_H

 

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    mgr =new QNetworkAccessManager(this);
    connect(mgr,SIGNAL(finished(QNetworkReply *)),this,SLOT(replayFinishedFunc(QNetworkReply *)));

}

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

void MainWindow::replayFinishedFunc(QNetworkReply *reply)//响应
{
    QString strall=reply->readAll();//读取数据
    ui->textBrowser->setText(strall);//将读取到的数据显示在文本编辑框内
    reply->deleteLater();
}
void MainWindow::on_pushButton_clicked()
{
    // ui->label_disp_setText("数据正在下载,请耐心等待。。。。。");
    ui->label_disp->setText("数据正在下载,请耐心等待。。。。。");
    mgr->get(QNetworkRequest(QUrl("http://www.baidu.com")));
}

 UI部分

2、第二个项目代码

httpserver.h

#ifndef HTTPSERVER_H
#define HTTPSERVER_H

#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>
class httpserver : public QObject
{
    Q_OBJECT
public:
    explicit httpserver(QObject *parent = nullptr);
    ~httpserver();
public:
    QTcpSocket *socket;
private:
    QTcpServer *ser;

public slots:
    void connection();

signals:

};

#endif // HTTPSERVER_H

 httpserver.cpp

#include "httpserver.h"

httpserver::httpserver(QObject *parent) : QObject(parent)
{
    ser=new QTcpServer(this);
    //信号与槽函数连接
    connect(ser,&QTcpServer::newConnection,this,&httpserver::connection);
    if(!ser->listen(QHostAddress::Any,8088))
    {
            qDebug()<<"指令错误:web服务器没有启动,请重新检查!"<<endl;;
    }else{
        qDebug()<<"正常启动:web服务器端口号:8080,等待客户端连接..."<<endl;
    }
}
 httpserver::~httpserver()
{
    socket->close();
}
void httpserver::connection()
{
    socket=ser->nextPendingConnection();
    while(!(socket->waitForReadyRead(100)));
    char webdata[1000];
    int sv=socket->read(webdata,1000);
    qDebug()<<"正常运行:从浏览去读取数据信息......"<<QString(webdata);
    socket->write("HTTP/1.1 200 OK\r\n");
    socket->write("Content-typ:text/html\r\n");
    socket->write("Refresh:1\r\n\r\n");//每秒刷新web浏览器
    socket ->write("<!DOCTYPE>"
                   "<html>"
                   "<header>"
                   "<meta http-equiv=\"Content-Type\" content=\"textt/html; charset=utf-8\"/>>"
                   "<title>httpserver</titile>"
                   "</hearder>"
                   "<body>客户端已经连接到HttpServer服务器秒数为:");
     QByteArray bytesary;
     static qint16 icount;//用于浏览器上显示的统计访问数字
     bytesary.setNum(icount++);
     socket->write(bytesary);
     socket->write("</html>");
    socket->flush();
   connect(socket,&QTcpSocket::disconnected,socket,&QTcpSocket::deleteLater);
    socket->disconnectFromHost();

}

main.cpp调用构造

#include <QCoreApplication>
#include "httpserver.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    httpserver ser;
    return a.exec();
}

函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值