Qt通过QtWebApp开发HTTP服务器 全球速看
Rice 嵌入式开发技术分享 2023-06-26 17:50:11


(相关资料图)

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服务器 全球速看

2023-06-26 17:50:11

糖尿病竟然能够逆转?除了看血糖,这项指标很关键! 看热讯

2023-06-26 17:56:34

世界视点!河北省唯一!深州市成功入选“五好两宜”和美乡村试点

2023-06-26 17:41:25

天天热讯:Signal的最新测试版增强了短信游戏功能让您在聊天中更具表现力

2023-06-26 17:38:18

猪企纷纷布局全产业链,能否对冲猪价走低风险?

2023-06-26 17:17:07

环球热头条丨古墓丽影:劳拉?克劳馥合集 6月29日登陆任天堂Switch

2023-06-26 17:03:02

全球讯息:【财经分析】引入资金“活水” 国产创新药走上发展快车道

2023-06-26 17:10:55

热点!成都酒店价格趋势-成都酒店价格

2023-06-26 16:50:41

文旅市场复苏势头强劲 继续释放消费潜力

2023-06-26 16:21:53

全球资讯:好神马

2023-06-26 16:20:17

斐济政府作出纠正台驻斐机构错误名称决定 中方表示欢迎_环球今日报

2023-06-26 16:09:02

时隔 4 年:华为线下出展 MWC 上海,轮值董事长孟晚舟将登台演讲

2023-06-26 15:57:40

当前要闻:陈梦30战胜削球悍将佐藤瞳,啃下硬骨头,顺利晋级吹响进攻号角

2023-06-26 15:39:46

当前快讯:朝鲜历史上也出现过“反清复明”计划

2023-06-26 15:17:39

空调之外,哪些家电也在增长? 世界关注

2023-06-26 15:38:00

环球短讯!韶关:27日8时前北江乌石站水位将在警戒水位较长时间小幅波动

2023-06-26 15:26:29

SHEIN发布“希有引力”百万卖家计划 三年助力一万卖家年销售破百万美元

2023-06-26 15:14:32

北京:对摇号中签家庭相关核查结果将于7月公布-滚动

2023-06-26 14:57:00

全球观速讯丨阿方索-戴维斯社媒晒照,和穆西亚拉坐游艇出海度假

2023-06-26 14:58:19

V观财报|实控人股权被司法冻结!太和水收上交所问询函 关注

2023-06-26 14:58:50

全球降温与亚洲内陆干旱化如何影响梳趾鼠演化|每日看点

2023-06-26 14:41:23

热门看点:【聚焦兰洽会】兰州城关:全力以赴寻找城市合伙人 共同创业推动高质量发展

2023-06-26 14:41:51

焦点简讯:新媒股份6月26日盘中跌幅达5%

2023-06-26 14:33:45

新资讯:第十四届夏季达沃斯论坛将开幕 中国声音、中国举措等受关注

2023-06-26 14:36:03

信用卡钱还不上怎么办?信用卡逾期会上征信吗?

2023-06-26 14:19:43

“状元概念股”三达膜市值大涨3亿,喜报已删除!员工称“董秘办正开会”_天天新消息

2023-06-26 14:09:46

头条:东体:泰山队想签下心仪外援,需要俱乐部在资金层面有新改变

2023-06-26 14:06:39

高通骁龙600和天玑700哪个好(高通骁龙600)_全球热闻

2023-06-26 13:39:43

今年快递业务量已达600亿件|全球今日讯

2023-06-26 13:43:05

厦门地铁规划图2030 结合新一轮地铁规划-快讯_每日速递

2023-06-26 13:32:21

小米投资通讯芯片公司智微电子

2023-06-26 13:36:05

全球视点!大都市如何“生”出万亩粮田?

2023-06-26 13:27:06

今年全国快递业务量已达600亿件_当前观点

2023-06-26 13:23:49

记者:B罗还未答应前往沙特,哈维正全力说服他加盟巴萨

2023-06-26 12:49:14

北京中华民族文化周举办 每日时讯

2023-06-26 12:47:59

关于批准发布《柴油机 非贵金属催化型排气捕集器》等团体标准的公告

2023-06-26 13:00:53

来吴昌硕纪念馆品“三吴墨妙”-环球新要闻

2023-06-26 12:46:49

美国周末多地发生枪击事件 至少6人死亡

2023-06-26 12:24:34

深圳发布民营及中小企业发展项目扶持计划操作规程

2023-06-26 12:24:37

海 利 得(002206):项目投产进展公告|全球简讯

2023-06-26 11:45:35

京东物流换帅,胡伟接替余睿出任物流CEO 当前报道

2023-06-26 11:39:28

端午假期全省旅游收入51.17亿

2023-06-26 11:15:56

中暑能走意外险吗?高温下的损失,保险怎么赔? 看热讯

2023-06-26 11:17:45

彩生活:陈新禹辞任公司执行董事

2023-06-26 11:09:29

车险手续费“价格战”消费者获利了吗?

2023-06-26 10:59:55

当前速递!高考志愿怎么填?A股董事长学历大数据来了!

2023-06-26 10:44:26

全身照图片素材_全身照图片

2023-06-26 10:29:52

高管称“兜里都是钱,等本土企业烧死再抢市场” 起亚有机会收拾别人吗?

2023-06-26 10:18:54

环球微资讯!感性选择礼物,给17岁的女儿一个难忘的生日!

2023-06-26 10:09:25

气象分析:今年夏天有多热?

2023-06-26 09:52:46

建材行业基本面数据大全

2023-06-26 09:48:22

球探:文-贝克二世将代表雄鹿出战夏联 其父曾在NBA征战过13年

2023-06-26 09:36:43

全省城镇燃气安全工作专项督导,首站走进成都液化石油气充装点|每日热文

2023-06-26 09:50:14

“泰坦”号灾难性内爆引人深思,深海潜水器应具备哪些安全功能|今日视点

2023-06-26 09:16:48

红米note12turbo谷歌框架

2023-06-26 09:24:55

接待游客82万人次 端午假期渝北旅游热度不减 焦点精选

2023-06-26 09:24:16

华为应该没有比它更简约耐看的主题了吧? 世界球精选

2023-06-26 08:47:51

“摁住毒贩的手才发现他捏着刀” 缉毒民警讲述自己的生死时刻-当前热议

2023-06-26 08:49:31

到底有多强:Wi-Fi 7要来了,国标刚刚公布! 每日热门

2023-06-26 08:41:18

英媒:美不愿乌“入约”的背后盘算

2023-06-26 08:30:48

《破冰72小时》首映 袁泉曾黎吴樾释小龙送祝福|前沿资讯

2023-06-26 08:06:10

绝地求生进游戏卡在加载界面_绝地求生进游戏卡界面_世界微动态

2023-06-26 08:07:23

每日信息:明朝是宦官专权的顶峰?错,唐朝才是!一件事情足以证明

2023-06-26 07:44:07

【全球快播报】深耕品质 肆拾玖坊打造传世酱香

2023-06-26 07:54:06

当前热门:亚马逊云科技投资1亿美元成立生成式AI创新中心

2023-06-26 06:55:27

微软删除 Win11 多项功能引发众怒:马上改回来!

2023-06-26 06:47:38

高能环境:联合中标武汉市土壤污染修复项目-新视野

2023-06-26 06:18:04

今年全国快递业务量已达600亿件 精彩看点

2023-06-26 06:28:51

出行、旅游、消费里看活力 端午假期各项数据亮眼

2023-06-26 05:54:45

今日热搜:2023年电池质子交换膜概念股票名单有哪些(6月25日)

2023-06-26 04:58:28

报道:悬崖之上周乙原型真实的结局_电视剧悬崖中的周乙原型是谁??

2023-06-26 04:39:49

华侨大学是211还是985

2023-06-26 04:28:37

世界观天下!村BA、村超都火了,下一个该海南“村排”了?

2023-06-26 04:04:27

世界今头条!2023年06月25日05时30分卢布/人民币汇率最新报价

2023-06-26 04:01:44

天天微资讯!无障碍环境法草案三审:拟将无障碍服务场所扩大至博物馆等

2023-06-26 03:43:38

国网泰安供电公司开展高温天气安全用电宣传|天天看点

2023-06-26 03:08:06

如何解决出现mobsync.dll加载错误的问题_天天报资讯

2023-06-26 03:01:02

与谷歌、微软“比武”!亚马逊成立生成式AI中心

2023-06-26 03:15:24

新动态:又一名国足归化将回国效力?目前处在初始运作阶段

2023-06-26 02:44:13

海南8月起将暂停临时养老保险缴费账户人员参保缴费-世界热点

2023-06-26 02:35:18

环球资讯:陇海铁路由兰州通向什么铁路

2023-06-26 02:46:34

苹果App Store设计指南灰色地带曝光 席勒还在干预

2023-06-26 02:14:50

山洪暴发女子大喊提醒,多名游客跑上岸躲过一劫 世界聚看点

2023-06-26 01:35:06

跨境周报丨进出口电商平台618战绩出炉;SHEIN计划将平台业务概念扩展到德西法意;TikTok首席运营官Pappas宣布离职

2023-06-26 01:28:15

小米14确认 首发骁龙8 Gen3_环球热闻

2023-06-26 00:50:08

爱上我死心眼歌曲_死心眼 歌曲相关内容简介介绍

2023-06-26 00:26:57

当前最新:紫塞秋风攻略完整版 紫塞秋风攻略

2023-06-26 00:17:05

环球即时:小里帮忙|游戏充值、拖欠工资……上周这些问题有进展

2023-06-26 00:17:57

中材国际(600970.SH):子公司签订总金额为3.86亿元人民币加189.29亿印度卢比合同

2023-06-26 00:15:37

供应链消息:鸿海正在加快iPhone 15在印度量产

2023-06-26 00:06:21

全球即时看!李呈金:6.25黄金触底反弹,下周多头趋势能否延续,黄金原油下周开盘操作建议

2023-06-25 23:53:42

世界新消息丨十年登峰之作!荣耀X50官宣:首发骁龙6 Gen1

2023-06-25 23:50:47

科学家为降低厌氧系统中的酸积累风险提供新思路

2023-06-25 23:36:19

《科学》子刊:华科同济医院王桂华教授团队发现,PD-L1甲基化是免疫治疗耐药的关键机制!

2023-06-25 22:58:43

特利迦与迪迦奥特曼线下联动,复合型胖成强壮型,造型极为瞩目!-全球速读

2023-06-25 22:41:31

霖磐高铁什么时候开工-环球看热讯

2023-06-25 22:33:23

拥抱“星星的孩子”_微头条

2023-06-25 21:52:32

2023年国内无线音频设备行业发展趋势预测

2023-06-25 21:56:35

苹果手机里的照片在电脑上显示不全_苹果手机连电脑不显示照片 当前头条

2023-06-25 21:27:45

有效的绩效评价系统必须满足五个标准 有效的绩效考核系统应该具备哪些标准

2023-06-25 21:29:43