当前资讯!Qt通过QtWebApp开发HTTP服务器
时间:2023-06-26 16:17:08来源:Rice 嵌入式开发技术分享


【资料图】

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

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

「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,解压之后的工程目录如下图:

RTools增加WebServer移植流程将QtWebApp的库移植到我们的工程中,库的路径:xxxQtWebAppQtWebApphttpserver,将目录下的所有文件拷贝到我们工程目中,添加的方式有两种:①使用工程加入子工程的方式,②将QtWebApp的库文件手动添加到工程中,博主选择第②种方式,为了归类代码模块。在RTools工程中添加一个httpServer的资源文件:httpServer.ini。配置文件参数说明: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功能创建一个类: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_OBJECTpublic:HttpServer(QObject*parent=nullptr);HttpServer(QStringpath);voidservice(HttpRequest&request,HttpResponse&response);private:QStringbasePath;};#endif//HTTPSERVER_H
创建一个类、带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");}
启动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)");.......}
关闭WebServer,①关闭http监听,②删除http监听对象
voidWebServerTool::httpStopListener(){if(httpListener!=nullptr){httpListener->close();deletehttpListener;httpListener=nullptr;}ui->buttonHttpStart->setText("启动(Start)");....}
验证WebServer功能在电脑的某个目录创建一个文件:RToolTest.txt(任意命名),并在文件中添加一些内容:打开RTools,选择WebServer工具,选择服务目录为存放文件RToolTest.txt的目录。选择电脑的IP,和设置端口号,并点击启动。验证:我在虚拟机中的ubuntu中,采用wget进行获取文件内容:执行命令如下:
wgethttp://IP:PORT/RToolTest.txt
当服务目录下存在我们请求的文件,执行结果:当服务目录下不存在我们请求的文件,执行结果:总结本次博主开发新版本的RTools中集成了Jlink tool和web server tool,后续将不断新增加功能web server tool目前只支持http,不支持https功能,博主将在后面开发完毕。

审核编辑黄宇

标签:

最新
  • 当前资讯!Qt通过QtWebApp开发HTTP服务器

    RTools工具是之前开源的一个工具,其目的是将平时要用到的工具集成在一

  • 雷朋汽车膜简介是什么?雷朋汽车防爆膜的特点有哪些?

    雷朋汽车膜简介是什么?雷朋产品主要是来自美日两大国际专业母厂,这

  • 6月25日江苏鑫万佳不锈钢报价下跌|全球热头条

    6月25日,江苏鑫万佳不锈钢有限公司,304,1 0四八尺平板价格报14100元

  • 当前简讯:花间词-枫意外传 女尊

    1、花间词-枫意外传(女尊)是一部古代言情类型网络小说,作者是莫惹是

  • 天天关注:什么是基金中的最大回撤?基金收益率怎么算?

    什么是基金中的最大回撤?基金的最大回撤指的是在选定周期内任一历史

  • 每日观察!意媒:利物浦为补强中场瞄准巴雷拉,准备提供8000万欧报价

    直播吧6月25日讯意媒IlTempo报道,想要补强中场的利物浦瞄准巴雷拉,准

  • 环球速看:预制菜应尽快制定国家标准

    预制菜的核心作用是提高种植端上的农民收入,由此实现乡村振兴。其次,

  • 当前动态:多地端午假期首日旅游成绩单出炉 你贡献了多少?-环球速看料

    端午假期首日全国各地旅游景区迎来游客高峰大家的出行热情有多高来看看

  • 最资讯丨《王者荣耀》S32赛季时间定了 新英雄亚连6月27日上线:又一个双剑战士

    6月24日消息,《王者荣耀》宣布S32新赛季正式定档6月27日(下周二),

  • 【全球时快讯】商业装修基本费用有哪些?网咖装修费用大概多少钱?

    商业装修基本费用主要有哪些?设计费商业装修设计费用一般在50—300

  • 全球新动态:身高一米五却名震香港,提拔刘德华、资助周润发,娶漂亮娇妻为妻

    身高一米五却名震香港,提拔刘德华、资助周润发,娶漂亮娇妻为妻在大多

  • 滚动:“女模特向评委席扔鞋”,官方通报

    6月22日,江苏健身健美发布《公告》,具体内容如下:2023年6月18日下午

  • 危险!七旬老人欲跳江 无恙!冰城公安伸援手-世界热推荐

    (王时)“我爸差点就发生了意外,多亏了警察同志,太感谢你们了!”今天

  • 每日讯息!*ST庞大:公司股票6月30日终止上市暨摘牌

    *ST庞大公告,公司收到上海证券交易所下发的《关于庞大汽贸集团股份有

  • 文韬武略的韬是什么意思(文韬武略的意思)|看热讯

    1、[释义]文有计谋;武有策略。2、指智勇双全。3、韬、略:《六韬》、

  • 岳麓山实验室第一届理事会和学术委员会成立

    会议现场。红网时刻新闻6月21日讯(记者吴公然)6月21日,岳麓山实验室

  • 旅游
    • 世界球精选!不少金牛座生来就活泼好动 胆子也随之增长?

    • 怎么一键删除微信朋友圈?微信一个手机号如何注册两个账号?

    • 乐观情绪持续发酵,海内外AI龙头联袂上涨 天天观速讯

    • 3V3羽毛球赛长春站完赛