电子说
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的库文件手动添加到工程中,我们(风火轮科技:https://www.youyeetoo.com/)选择第②种方式,为了归类代码模块。
在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方法,我们(风火轮科技:https://www.youyeetoo.com/)开发该工具的目的是支持客户端可以通过wget获取文件。类的内容如下:
httpserver.cpp内容:构造函数设置指定服务目录;service方法实现将文件内容传输给客户端,如果文件不存在则返回404错误.
#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"); } }
httpserver.h内容:
#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
创建一个类、带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功能,博主将在后面开发完毕。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !