一、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();
}
函数