当前位置: 首页 > 工具软件 > tufao > 使用案例 >

TuFao服务器的安装和搭建

马弘和
2023-12-01

TuFao服务器

tufao是一个由QT编写的HTTP服务器。
tufao代替apache来实现http的通信。

安装tufao

  • 获取原代码
  • 编译和安装
    sudo apt-get install cmake qt-sdk
    在tufao目录下创建build目录
    cd build
    cmake .. -DCMAKE_INSTALL_PREFIX=/usr
    make
    sudo make install
  • 创建工程
    创建空的工程
    工程文件中增加CONFIG += TUFAO1 C++11
    增加一个类MyServer,一定是QObject派生类
    增加一个main.cpp实现main函数
    在MyServer的构造函数,创建Tufao::HttpServer对象server
    将server的信号requestReady和自己写的槽函数slotRequestReady连接
    在slotRequestReady函数中,实现http协议的响应报文。
    示例如下:
    MyServerHandlePost.h
#ifndef MYSERVERHANDLEPOST_H
#define MYSERVERHANDLEPOST_H
#include <QObject>
#include <Tufao/HttpServer>
#include <Tufao/HttpServerRequest>
#include <Tufao/HttpServerResponse>
using namespace Tufao;

class MyServerHandlePost : public QObject
{
    Q_OBJECT
public:
    explicit MyServerHandlePost(QObject *parent = 0);

    HttpServer* server;

    void handlePostData(HttpServerRequest&, HttpServerResponse&);
signals:

public slots:
    void slotRequestReady(HttpServerRequest&, HttpServerResponse&);
};

#endif // MYSERVERHANDLEPOST_H

MyServerHandlePost.cpp

#include "MyServerHandlePost.h"
#include <QFile>

#include <QJsonObject>
#include <QJsonValue>
#include <QJsonDocument>
#include <QJsonArray>

MyServerHandlePost::MyServerHandlePost(QObject *parent) : QObject(parent)
{
    server = new HttpServer;
    if(!server->listen(QHostAddress::Any, 8081))
    {
        qDebug()<<"bind error";
    }

    connect(server, &HttpServer::requestReady,
            this, &MyServerHandlePost::slotRequestReady);

}

void MyServerHandlePost::handlePostData(HttpServerRequest &request, HttpServerResponse &response)
{
//    QFile file("/home/xueguoliang/a.txt_upload");
//    file.open(QFile::WriteOnly);

    /*
        data is {username: "xxx", password: "yyy"}
    */
    QByteArray data = request.readBody();

    QJsonDocument doc = QJsonDocument::fromJson(data);
    QJsonObject root = doc.object();
    QString username = root.value("username").toString();
    QString password = root.value("password").toString();

    if(username == "aaa" && password== "bbb")
    {
        // {result: "ok"}
        root.insert("result", QString("ok"));
    }
    else
    {
        // {result: "ok"}

        root.insert("result", QString("err"));
        root.insert("reason", QString("username or password error"));
    }

    {
    QJsonDocument doc(root);
    QByteArray buf = doc.toJson();

    response.writeHead(HttpResponseStatus::OK);
    response.end(buf);
    }
//    file.write(data);
//    file.close();
}

void MyServerHandlePost::slotRequestReady(HttpServerRequest &request, HttpServerResponse & response)
{

    if(request.method() == "POST")
    {
      //  connect(&request, &HttpServerRequest::ready, )
        // end signal: all data is ready
     //   connect(&request, SIGNAL(end()), this, SLOT(slotDataEnd()));
        connect(&request, &HttpServerRequest::end, [&](){
            handlePostData(request, response);
        });
    }
    else
    {
        response.writeHead(HttpResponseStatus::OK);
        response.end("i need post method\n");
    }
}
 类似资料: