Qt通过QtWebApp开发HTTP服务器

rtools工具是之前开源的一个工具,其目的是将平时要用到的工具集成在一起,方便使用;也有一段时间没有更新新功能了。本次新功能增加的同时,ui重构了一遍。更加方面快捷,后续将不断新增加功能。 在实际项目开发中http是我们经常使用的,嵌入式设备往往作为客户端,而服务器一般都是部署在云端等设备上,这对于调试过程其实是很不方便的,其实网上也有更多工具可以在自己的pc上一键部署为http服务器。例如:mywebserver工具。 虽然有像mywebserver工具这么方便的工具,但是对于博主来说,还是不太便捷的,又要打开一个工具,所以想着将mywebserver工具的功能集成到rtools中。 通过搜索一遍,qt有一个比较好的http服务器库--qtwebapp。 什么是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,解压之后的工程目录如下图:
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 qdirhttpserver::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);    }} httpserver.h内容: #ifndef httpserver_h#define httpserver_h#include httprequesthandler.husing namespace stefanfrings;class httpserver : public httprequesthandler{    q_objectpublic:    httpserver(qobject* parent=nullptr);    httpserver(qstring path);    void service(httprequest& request, httpresponse& response);private:    qstring basepath;};#endif // httpserver_h 创建一个类、带ui的:webservertool。 在构造函数中,获取ini文件listener组的配置。 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);} 启动webserver,①获取http服务目录,②根据用户设置host(服务器ip)和port(服务器端口号)更新监听配置,然后创建http监听 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));    .......} 关闭webserver,①关闭http监听,②删除http监听对象 void webservertool::httpstoplistener(){    if(httplistener != nullptr)    {        httplistener->close();        delete httplistener;        httplistener = nullptr;    }    ui->buttonhttpstart->settext(启动(start));    ....} 验证webserver功能 在电脑的某个目录创建一个文件:rtooltest.txt(任意命名),并在文件中添加一些内容: 打开rtools,选择webserver工具,选择服务目录为存放文件rtooltest.txt的目录。选择电脑的ip,和设置端口号,并点击启动。 验证:我在虚拟机中的ubuntu中,采用wget进行获取文件内容:执行命令如下: wget http://ip:port/rtooltest.txt 当服务目录下存在我们请求的文件,执行结果: 当服务目录下不存在我们请求的文件,执行结果: 总结 本次博主开发新版本的rtools中集成了jlink tool和web server tool,后续将不断新增加功能 web server tool目前只支持http,不支持https功能,博主将在后面开发完毕。


静电消除器在工业设备中的用途
移动通信的下一站——毫米波
共进股份:国内智能传感器产业仍在起步阶段,发展空间十分广阔
关于霍尼韦尔CSNX1000M系列电流传感器的性能分析和应用
百度汽车最迟2024年量产
Qt通过QtWebApp开发HTTP服务器
波束赋形知识介绍
硅橡胶电缆的特性分析以及应用领域的介绍
电热管的接线方法?
关于直播声卡无线应用2.4G解决方案--天惠微MD7800方案
努比亚Z17最新消息:努比亚Z17真旗舰配置太彪悍!8GB内存+2300W双摄+IP67防水
史上最全蓝牙耳机排行榜:知名度最高的全球十大耳机排名
大众在接下来的若干年中,要讲的新故事
Iridium星座的组网能力评价
推荐几款降噪能力不错的蓝牙耳机分享给大家
2020年机房空调规模有望再迎新高突破60亿,同比增长或将达9%以上
拒绝套路、内幕,揭穿不良厂商的蓝牙“残血版”
浅谈嵌入式MCU的中断处理
高交会电子展:纵观全球电子产业局势,把脉细分市场走向
20~40W电子镇流器原理与维修