0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Qt通过QtWebApp开发HTTP服务器

Rice嵌入式开发技术分享 来源:Rice 嵌入式开发技术分享 作者:Rice 嵌入式开发技 2023-06-26 08:38 次阅读
  1. RTools工具是之前开源的一个工具,其目的是将平时要用到的工具集成在一起,方便使用;也有一段时间没有更新新功能了。本次新功能增加的同时,UI重构了一遍。更加方面快捷,后续将不断新增加功能。
ca74294e-13b9-11ee-9c1d-dac502259ad0.png
  1. 在实际项目开发中HTTP是我们经常使用的,嵌入式设备往往作为客户端,而服务器一般都是部署在云端等设备上,这对于调试过程其实是很不方便的,其实网上也有更多工具可以在自己的PC上一键部署为HTTP服务器。例如:MyWebServer工具。
ca8b955c-13b9-11ee-9c1d-dac502259ad0.png
  1. 虽然有像MyWebServer工具这么方便的工具,但是对于博主来说,还是不太便捷的,又要打开一个工具,所以想着将MyWebServer工具的功能集成到RTools中。
  2. 通过搜索一遍,Qt有一个比较好的Http服务器库--QtWebApp。
ca97f7fc-13b9-11ee-9c1d-dac502259ad0.png

什么是QtWebApp

QtWepApp是一个C++中的HTTP服务器库,其灵感来自Java Servlet。

「QtWebApp包含以下组件:」

  • HTTP 1.1服务器(HTTP 1.1 Server)
  • 模板引擎(Template Engine)
  • 文件记录器(File Logger)
  • Windows服务安装程序(Windows Service Installer)
  • 演示应用程序(Demo Applications)

HTTP服务器在并发线程中处理传入请求。它支持持久连接、HTTPS、会话cookie和文件上传。

其中包括一个简单的支持多种语言的模板引擎,它用运行时值填充文本文件中的占位符。模板引擎还支持条件输出和循环。其他更大的模板引擎,如ClearSilver,也可以用作替代方案。

记录器插入Qt,并将日志消息从qDebug(…)重定向到qFatal(…)到文件,同时还添加了时间戳、线程ID、会话ID等附加属性。对记录器配置文件的更改将自动变为活动状态,而无需重新启动程序。

QtService组件使您能够将应用程序设置为Windows服务。

大约2MB的小内存需求使web服务器有资格用于嵌入式系统。但对于更大的网络服务来说,它也足够强大。

「有关如何使用库的教程,请参阅:」 http://stefanfrings.de/qtwebapp/tutorial/index.html

QtWebApp工程

QtWebApp工程包含了库代码和实例代码,「QtWebApp库下载链接:」 http://stefanfrings.de/qtwebapp/QtWebApp.zip,解压之后的工程目录如下图:

caabccaa-13b9-11ee-9c1d-dac502259ad0.png

RTools增加WebServer

移植流程

  1. 将QtWebApp的库移植到我们的工程中,库的路径:xxxQtWebAppQtWebApphttpserver,将目录下的所有文件拷贝到我们工程目中,添加的方式有两种:①使用工程加入子工程的方式,②将QtWebApp的库文件手动添加到工程中,博主选择第②种方式,为了归类代码模块。
cab66bd8-13b9-11ee-9c1d-dac502259ad0.png
  1. 在RTools工程中添加一个httpServer的资源文件:httpServer.ini。配置文件参数说明:
cac80c3a-13b9-11ee-9c1d-dac502259ad0.png
  • host和post:代表web服务器的IP地址和端口。公用Web服务器使用端口80,而内部Web服务器通常在端口8080上侦听。
  • minThreads:代表始终保持运行的线程数量,用来确保一段时间不活动后的良好响应时间。
  • maxThreads:QtWebApp可以同时处理多个http请求,该参数指定并发工作线程的最大数量。其值要根据机器性能而定(可以利用负载生成器等工具来确定)。
  • cleanupInterval:Web服务器始终以空线程池开头,当HTTP请求进入时,将根据需要创建线程。空闲线程由计时器缓慢关闭。每隔一个cleanupInterval时间间隔(以毫秒为单位),服务器都将关闭一个空闲线程。
  • readTimeout:设置通过打开大量连接而不使用它们,来保护服务器免受简单的拒绝服务攻击。静默连接将在设定的毫秒数后被关闭。通常情况下,是由Web浏览器来关闭连接。
  • maxRequestSize:保护服务器免受非常多的HTTP请求而导致内存过载的影响。此值适用于常规请求。
  • maxMultiPartSize:适用于网络浏览器将文件上传到服务器时发生的大部分请求。如果要接受10 MB的文件,由于HTTP协议开销,必须将此值设置得更大一些。

开发WebServer功能

  1. 创建一个类:HttpServer,继承HttpRequestHandler,该类重写了service方法博主开发该工具的目的是支持客户端可以通过wget获取文件。类的内容如下:
  • httpserver.cpp内容:构造函数设置指定服务目录;service方法实现将文件内容传输给客户端,如果文件不存在则返回404错误.
#include"httpserver.h"
#include"QDir"

HttpServer::HttpServer(QObject*parent)
:HttpRequestHandler(parent)
{
Q_UNUSED(parent)
}

HttpServer::HttpServer(QStringpath)
{
basePath=path;
}

voidHttpServer::service(HttpRequest&request,HttpResponse&response)
{

QFilefile(basePath+request.getPath());
if(file.open(QFile::ReadOnly))
{
response.setHeader("Content-Type","application/octet-stream");
while(!file.atEnd()&&!file.error())
{
QByteArraybuffer=file.readAll();
response.write(buffer);
}
}
else
{
response.setStatus(404,"Filenotfound");
}
}

  • httpserver.h内容:
#ifndefHTTPSERVER_H
#defineHTTPSERVER_H

#include"httprequesthandler.h"

usingnamespacestefanfrings;
classHttpServer:publicHttpRequestHandler
{
Q_OBJECT
public:
HttpServer(QObject*parent=nullptr);
HttpServer(QStringpath);

voidservice(HttpRequest&request,HttpResponse&response);
private:
QStringbasePath;
};

#endif//HTTPSERVER_H
  1. 创建一个类、带UI的:webservertool。
  • 在构造函数中,获取ini文件listener组的配置。
WebServerTool::WebServerTool(QWidget*parent):
QMainWindow(parent),
ui(newUi::WebServerTool)
{
ui->setupUi(this);

listenerSettings=newQSettings(":/HttpServer/httpServer.ini",QSettings::IniFormat,nullptr);
listenerSettings->beginGroup("listener");
}
  1. 启动WebServer,①获取http服务目录,②根据用户设置host(服务器IP)和port(服务器端口号)更新监听配置,然后创建http监听
voidWebServerTool::httpStartListener()
{
if(httpListener!=nullptr)
{
httpListener->close();
deletehttpListener;
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=newHttpServer(ui->lineEditHttpPath->text());
httpListener=newHttpListener(listenerSettings,httpServer,nullptr);
if(httpListener==nullptr)
{
ui->textBrowserHttpLog->append("Http启动监听失败");
}
else
{
ui->textBrowserHttpLog->append("Http启动监听成功");
}
ui->buttonHttpStart->setText("停止(Stop)");
.......
}
  1. 关闭WebServer,①关闭http监听,②删除http监听对象
voidWebServerTool::httpStopListener()
{
if(httpListener!=nullptr)
{
httpListener->close();
deletehttpListener;
httpListener=nullptr;
}

ui->buttonHttpStart->setText("启动(Start)");
....
}

验证WebServer功能

  1. 电脑的某个目录创建一个文件:RToolTest.txt(任意命名),并在文件中添加一些内容:
cad60e98-13b9-11ee-9c1d-dac502259ad0.png
  1. 打开RTools,选择WebServer工具,选择服务目录为存放文件RToolTest.txt的目录。选择电脑的IP,和设置端口号,并点击启动。
cae7a86a-13b9-11ee-9c1d-dac502259ad0.png
  1. 验证:我在虚拟机中的ubuntu中,采用wget进行获取文件内容:执行命令如下:
wgethttp://IP:PORT/RToolTest.txt
  • 当服务目录下存在我们请求的文件,执行结果:
caf947fa-13b9-11ee-9c1d-dac502259ad0.png
  • 当服务目录下不存在我们请求的文件,执行结果:
cb08e336-13b9-11ee-9c1d-dac502259ad0.png

总结

  1. 本次博主开发新版本的RTools中集成了Jlink tool和web server tool,后续将不断新增加功能
  2. web server tool目前只支持http,不支持https功能,博主将在后面开发完毕。

cb126f6e-13b9-11ee-9c1d-dac502259ad0.png


审核编辑黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    8125

    浏览量

    82551
  • HTTP
    +关注

    关注

    0

    文章

    467

    浏览量

    30324
  • Qt
    Qt
    +关注

    关注

    1

    文章

    299

    浏览量

    37340
收藏 人收藏

    评论

    相关推荐

    基于HTTP网页服务器和UDP上位机的MJPG码流传输

    本文采用的硬件板卡为飞凌嵌入式OKMX8MP-C开发板,系统版本Linux5.4.70+Qt5.15.0,主要介绍基于HTTP网页服务器和UDP上位机的MJPG码流传输。
    发表于 06-09 11:27 1467次阅读

    Linux开发_CentOS7.4服务器搭建NFS、NGINX服务器,安装ffmpeg、Qt环境

    在CentOS7.4服务器版本的环境下搭建NFS服务器、安装ffmpeg、安装nginx服务器、部署Qt编译环境。
    的头像 发表于 07-14 13:45 974次阅读
    Linux<b class='flag-5'>开发</b>_CentOS7.4<b class='flag-5'>服务器</b>搭建NFS、NGINX<b class='flag-5'>服务器</b>,安装ffmpeg、<b class='flag-5'>Qt</b>环境

    labview如何通过http协议上传数据至web服务器

    本人小白,对网络和通讯都是菜鸟。最近在学习labview如何通过http协议上传数据至web服务器,这个web服务器是一般构建的服务器,不是
    发表于 10-30 17:28

    labview如何通过http协议post方法上传数据至web服务器

    各位前辈好: 本人小白,对网络和通讯都是菜鸟。 最近有个小程序,要用labview通过http协议post方法上传数据至web服务器(请求和响应的格式见图片),这个web服务器是用C语
    发表于 06-12 09:44

    OPC服务器开发浅谈 — 服务器模型

    这里主要讨论的是OPC Data Access 2.0服务器开发,在掌握了这个最常用的OPC服务器开发之后,对其它类型的OPC服务器,如A
    发表于 07-02 08:29

    使用NodeMCU创建一个简单的HTTP服务器

    我正在尝试使用NodeMCU创建一个简单的HTTP服务器 . 我启动nodeMCU然后将其连接到wifi,然后运行下面的程序 . 我可以从浏览连接到服务器 . 如果我继续重新加载页面
    发表于 11-01 06:03

    什么是Boa服务器

    嵌入式web服务器Boa的移植什么是Boa服务器BOA 服务器是一个小巧高效的web服务器,是一个运行于unix或linux下的,支持CGI的、适合于嵌入式系统的单任务的
    发表于 12-14 07:21

    HTTP OTA webclient获取不到服务器如何处理?

    尝试用HTTP_OTA的方式来升级程序,按照网上的资料搭建程序,在http_ota.c中现在遇到Webclient获取不到服务器的情况:找不到服务器
    发表于 05-19 10:43

    如何基于HTTP Web服务器示例实现TLS HTTPS服务器

    我正在尝试基于此 HTTP Web 服务器示例实现 TLS HTTPS 服务器:https://github.com/STMicroelectronics/x-cube-azrtos-h7/tree
    发表于 01-04 06:23

    如何通过http请求将值发送到服务器

    我正在使用 nodemcu 创建一个网络服务器。我想通过 http 请求将值发送到服务器。我已成功创建服务器并在 Windows 上使用 f
    发表于 02-27 06:48

    如何将.txt 大文件发送到HTTP服务器

    我在 SPIFFS 闪存中创建了多个 .txt 文件系统。但是如何将 .txt 大文件发送到 HTTP 服务器,可以通过 ESP8266 12F 将 SPIFFS 1MB 文件发送到上传 HT
    发表于 05-19 09:00

    HTTP服务器使用uIP TCP/ IP堆栈的示例

    EC_ M480_ uIP_ HTTP_Led_V1. 00 显示 HTTP 服务器, 网页非常简单 。 HTTP 客户端, 例如 IE 或 Chrome , 可以
    发表于 08-22 07:07

    基于HTTP网页服务器和UDP上位机的MJPG码流传输

    本文采用的硬件板卡为飞凌嵌入式OKMX8MP-C开发板,系统版本Linux5.4.70+Qt5.15.0,主要介绍基于HTTP网页服务器和UDP上位机的MJPG码流传输。
    发表于 01-23 12:05 614次阅读

    Qt通过QtWebApp开发HTTP服务器

    RTools工具是之前开源的一个工具,其目的是将平时要用到的工具集成在一起,方便使用;也有一段时间没有更新新功能了。本次联合风火轮科技,UI重构了一遍。更加方面快捷,后续将不断新增加功能。
    的头像 发表于 06-25 10:17 1563次阅读
    <b class='flag-5'>Qt</b><b class='flag-5'>通过</b><b class='flag-5'>QtWebApp</b><b class='flag-5'>开发</b><b class='flag-5'>HTTP</b><b class='flag-5'>服务器</b>

    如何利用AWFlow搭建HTTP服务器

    本文将基于EsDA开发套件快速在开发板上搭建HTTP服务器,为HTTP客户端提供了访问板子的外设资源,数据以及文件读写等接口,实现设备与网络
    的头像 发表于 12-14 08:24 218次阅读
    如何利用AWFlow搭建<b class='flag-5'>HTTP</b><b class='flag-5'>服务器</b>