QtWepApp是一个C++中的HTTP服务器库,其灵感来自Java Servlet。
「QtWebApp包含以下组件:」
HTTP服务器在并发线程中处理传入请求。它支持持久连接、HTTPS、会话cookie和文件上传。
其中包括一个简单的支持多种语言的模板引擎,它用运行时值填充文本文件中的占位符。模板引擎还支持条件输出和循环。其他更大的模板引擎,如ClearSilver,也可以用作替代方案。
记录器插入Qt,并将日志消息从qDebug(…)重定向到qFatal(…)到文件,同时还添加了时间戳、线程ID、会话ID等附加属性。对记录器配置文件的更改将自动变为活动状态,而无需重新启动程序。
QtService组件使您能够将应用程序设置为Windows服务。
大约2MB的小内存需求使web服务器有资格用于嵌入式系统。但对于更大的网络服务来说,它也足够强大。
「有关如何使用库的教程,请参阅:」 http://stefanfrings.de/qtwebapp/tutorial/index.html
QtWebApp工程包含了库代码和实例代码,「QtWebApp库下载链接:」 http://stefanfrings.de/qtwebapp/QtWebApp.zip,解压之后的工程目录如下图:
#include "httpserver.h"
#include "QDir"
HttpServer::HttpServer(QObject* parent)
: HttpRequestHandler(parent)
{
Q_UNUSED(parent)
}
HttpServer::HttpServer(QString path)
{
basePath = path;
}
void HttpServer::service(HttpRequest &request, HttpResponse &response)
{
QFile file(basePath + request.getPath());
if(file.open(QFile::ReadOnly))
{
response.setHeader("Content-Type", "application/octet-stream");
while (!file.atEnd() && !file.error())
{
QByteArray buffer=file.readAll();
response.write(buffer);
}
}
else
{
response.setStatus(404, "File not found");
}
}
#ifndef HTTPSERVER_H
#define HTTPSERVER_H
#include "httprequesthandler.h"
using namespace stefanfrings;
class HttpServer : public HttpRequestHandler
{
Q_OBJECT
public:
HttpServer(QObject* parent=nullptr);
HttpServer(QString path);
void service(HttpRequest& request, HttpResponse& response);
private:
QString basePath;
};
#endif // HTTPSERVER_H
WebServerTool::WebServerTool(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::WebServerTool)
{
ui->setupUi(this);
listenerSettings = new QSettings(":/HttpServer/httpServer.ini", QSettings::IniFormat, nullptr);
listenerSettings->beginGroup("listener");
}
void WebServerTool::httpStartListener()
{
if(httpListener != nullptr)
{
httpListener->close();
delete httpListener;
httpListener = nullptr;
}
if(ui->lineEditHttpPath->text().isEmpty())
{
ui->textBrowserHttpLog->append("请选择http服务目录");
return;
}
listenerSettings->setValue("host", ui->comboBoxHttpIp->currentText());
listenerSettings->setValue("port", ui->lineEditHttpPort->text());
httpServer = new HttpServer(ui->lineEditHttpPath->text());
httpListener = new HttpListener(listenerSettings, httpServer, nullptr);
if(httpListener == nullptr)
{
ui->textBrowserHttpLog->append("Http 启动监听失败");
}
else
{
ui->textBrowserHttpLog->append("Http 启动监听成功");
}
ui->buttonHttpStart->setText("停止(Stop)");
.......
}
void WebServerTool::httpStopListener()
{
if(httpListener != nullptr)
{
httpListener->close();
delete httpListener;
httpListener = nullptr;
}
ui->buttonHttpStart->setText("启动(Start)");
....
}
wget http://IP:PORT/RToolTest.txt
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !