- RTools工具是之前開(kāi)源的一個(gè)工具,其目的是將平時(shí)要用到的工具集成在一起,方便使用;也有一段時(shí)間沒(méi)有更新新功能了。本次新功能增加的同時(shí),UI重構(gòu)了一遍。更加方面快捷,后續(xù)將不斷新增加功能。

- 在實(shí)際項(xiàng)目開(kāi)發(fā)中HTTP是我們經(jīng)常使用的,嵌入式設(shè)備往往作為客戶(hù)端,而服務(wù)器一般都是部署在云端等設(shè)備上,這對(duì)于調(diào)試過(guò)程其實(shí)是很不方便的,其實(shí)網(wǎng)上也有更多工具可以在自己的PC上一鍵部署為HTTP服務(wù)器。例如:MyWebServer工具。

- 雖然有像MyWebServer工具這么方便的工具,但是對(duì)于博主來(lái)說(shuō),還是不太便捷的,又要打開(kāi)一個(gè)工具,所以想著將MyWebServer工具的功能集成到RTools中。
- 通過(guò)搜索一遍,Qt有一個(gè)比較好的Http服務(wù)器庫(kù)--QtWebApp。

什么是QtWebApp
QtWepApp是一個(gè)C++中的HTTP服務(wù)器庫(kù),其靈感來(lái)自Java Servlet。
「QtWebApp包含以下組件:」
- HTTP 1.1服務(wù)器(HTTP 1.1 Server)
- 模板引擎(Template Engine)
- 文件記錄器(File Logger)
- Windows服務(wù)安裝程序(Windows Service Installer)
- 演示應(yīng)用程序(Demo Applications)
HTTP服務(wù)器在并發(fā)線(xiàn)程中處理傳入請(qǐng)求。它支持持久連接、HTTPS、會(huì)話(huà)cookie和文件上傳。
其中包括一個(gè)簡(jiǎn)單的支持多種語(yǔ)言的模板引擎,它用運(yùn)行時(shí)值填充文本文件中的占位符。模板引擎還支持條件輸出和循環(huán)。其他更大的模板引擎,如ClearSilver,也可以用作替代方案。
記錄器插入Qt,并將日志消息從qDebug(…)重定向到qFatal(…)到文件,同時(shí)還添加了時(shí)間戳、線(xiàn)程ID、會(huì)話(huà)ID等附加屬性。對(duì)記錄器配置文件的更改將自動(dòng)變?yōu)榛顒?dòng)狀態(tài),而無(wú)需重新啟動(dòng)程序。
QtService組件使您能夠?qū)?yīng)用程序設(shè)置為Windows服務(wù)。
大約2MB的小內(nèi)存需求使web服務(wù)器有資格用于嵌入式系統(tǒng)。但對(duì)于更大的網(wǎng)絡(luò)服務(wù)來(lái)說(shuō),它也足夠強(qiáng)大。
「有關(guān)如何使用庫(kù)的教程,請(qǐng)參閱:」 http://stefanfrings.de/qtwebapp/tutorial/index.html
QtWebApp工程
QtWebApp工程包含了庫(kù)代碼和實(shí)例代碼,「QtWebApp庫(kù)下載鏈接:」 http://stefanfrings.de/qtwebapp/QtWebApp.zip,解壓之后的工程目錄如下圖:

RTools增加WebServer
移植流程
- 將QtWebApp的庫(kù)移植到我們的工程中,庫(kù)的路徑:xxxQtWebAppQtWebApphttpserver,將目錄下的所有文件拷貝到我們工程目中,添加的方式有兩種:①使用工程加入子工程的方式,②將QtWebApp的庫(kù)文件手動(dòng)添加到工程中,博主選擇第②種方式,為了歸類(lèi)代碼模塊。

- 在RTools工程中添加一個(gè)httpServer的資源文件:httpServer.ini。配置文件參數(shù)說(shuō)明:

- host和post:代表web服務(wù)器的IP地址和端口。公用Web服務(wù)器使用端口80,而內(nèi)部Web服務(wù)器通常在端口8080上偵聽(tīng)。
- minThreads:代表始終保持運(yùn)行的線(xiàn)程數(shù)量,用來(lái)確保一段時(shí)間不活動(dòng)后的良好響應(yīng)時(shí)間。
- maxThreads:QtWebApp可以同時(shí)處理多個(gè)http請(qǐng)求,該參數(shù)指定并發(fā)工作線(xiàn)程的最大數(shù)量。其值要根據(jù)機(jī)器性能而定(可以利用負(fù)載生成器等工具來(lái)確定)。
- cleanupInterval:Web服務(wù)器始終以空線(xiàn)程池開(kāi)頭,當(dāng)HTTP請(qǐng)求進(jìn)入時(shí),將根據(jù)需要?jiǎng)?chuàng)建線(xiàn)程。空閑線(xiàn)程由計(jì)時(shí)器緩慢關(guān)閉。每隔一個(gè)cleanupInterval時(shí)間間隔(以毫秒為單位),服務(wù)器都將關(guān)閉一個(gè)空閑線(xiàn)程。
- readTimeout:設(shè)置通過(guò)打開(kāi)大量連接而不使用它們,來(lái)保護(hù)服務(wù)器免受簡(jiǎn)單的拒絕服務(wù)攻擊。靜默連接將在設(shè)定的毫秒數(shù)后被關(guān)閉。通常情況下,是由Web瀏覽器來(lái)關(guān)閉連接。
- maxRequestSize:保護(hù)服務(wù)器免受非常多的HTTP請(qǐng)求而導(dǎo)致內(nèi)存過(guò)載的影響。此值適用于常規(guī)請(qǐng)求。
- maxMultiPartSize:適用于網(wǎng)絡(luò)瀏覽器將文件上傳到服務(wù)器時(shí)發(fā)生的大部分請(qǐng)求。如果要接受10 MB的文件,由于HTTP協(xié)議開(kāi)銷(xiāo),必須將此值設(shè)置得更大一些。
開(kāi)發(fā)WebServer功能
- 創(chuàng)建一個(gè)類(lèi):HttpServer,繼承HttpRequestHandler,該類(lèi)重寫(xiě)了service方法博主開(kāi)發(fā)該工具的目的是支持客戶(hù)端可以通過(guò)wget獲取文件。類(lèi)的內(nèi)容如下:
- httpserver.cpp內(nèi)容:構(gòu)造函數(shù)設(shè)置指定服務(wù)目錄;service方法實(shí)現(xiàn)將文件內(nèi)容傳輸給客戶(hù)端,如果文件不存在則返回404錯(cuò)誤.
#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內(nèi)容:
#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
- 創(chuàng)建一個(gè)類(lèi)、帶UI的:webservertool。
- 在構(gòu)造函數(shù)中,獲取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");
}
- 啟動(dòng)WebServer,①獲取http服務(wù)目錄,②根據(jù)用戶(hù)設(shè)置host(服務(wù)器IP)和port(服務(wù)器端口號(hào))更新監(jiān)聽(tīng)配置,然后創(chuàng)建http監(jiān)聽(tīng)
voidWebServerTool::httpStartListener()
{
if(httpListener!=nullptr)
{
httpListener->close();
deletehttpListener;
httpListener=nullptr;
}
if(ui->lineEditHttpPath->text().isEmpty())
{
ui->textBrowserHttpLog->append("請(qǐng)選擇http服務(wù)目錄");
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啟動(dòng)監(jiān)聽(tīng)失敗");
}
else
{
ui->textBrowserHttpLog->append("Http啟動(dòng)監(jiān)聽(tīng)成功");
}
ui->buttonHttpStart->setText("停止(Stop)");
.......
}
- 關(guān)閉WebServer,①關(guān)閉http監(jiān)聽(tīng),②刪除http監(jiān)聽(tīng)對(duì)象
voidWebServerTool::httpStopListener()
{
if(httpListener!=nullptr)
{
httpListener->close();
deletehttpListener;
httpListener=nullptr;
}
ui->buttonHttpStart->setText("啟動(dòng)(Start)");
....
}
驗(yàn)證WebServer功能
- 在電腦的某個(gè)目錄創(chuàng)建一個(gè)文件:RToolTest.txt(任意命名),并在文件中添加一些內(nèi)容:

- 打開(kāi)RTools,選擇WebServer工具,選擇服務(wù)目錄為存放文件RToolTest.txt的目錄。選擇電腦的IP,和設(shè)置端口號(hào),并點(diǎn)擊啟動(dòng)。

- 驗(yàn)證:我在虛擬機(jī)中的ubuntu中,采用wget進(jìn)行獲取文件內(nèi)容:執(zhí)行命令如下:
wgethttp://IP:PORT/RToolTest.txt
- 當(dāng)服務(wù)目錄下存在我們請(qǐng)求的文件,執(zhí)行結(jié)果:

- 當(dāng)服務(wù)目錄下不存在我們請(qǐng)求的文件,執(zhí)行結(jié)果:

總結(jié)
- 本次博主開(kāi)發(fā)新版本的RTools中集成了Jlink tool和web server tool,后續(xù)將不斷新增加功能
- web server tool目前只支持http,不支持https功能,博主將在后面開(kāi)發(fā)完畢。
審核編輯黃宇
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9659瀏覽量
87161 -
HTTP
+關(guān)注
關(guān)注
0文章
519瀏覽量
32396 -
Qt
+關(guān)注
關(guān)注
1文章
313瀏覽量
38730
發(fā)布評(píng)論請(qǐng)先 登錄
基于HTTP網(wǎng)頁(yè)服務(wù)器和UDP上位機(jī)的MJPG碼流傳輸
Linux開(kāi)發(fā)_CentOS7.4服務(wù)器搭建NFS、NGINX服務(wù)器,安裝ffmpeg、Qt環(huán)境

labview如何通過(guò)http協(xié)議上傳數(shù)據(jù)至web服務(wù)器
labview如何通過(guò)http協(xié)議post方法上傳數(shù)據(jù)至web服務(wù)器
HTTP OTA webclient獲取不到服務(wù)器如何處理?
如何辨別Web服務(wù)器,應(yīng)用程序服務(wù)器,HTTP服務(wù)器
如何正確的理解使用WEB服務(wù)器和應(yīng)用程序服務(wù)器及HTTP服務(wù)器

Java編程:發(fā)送HTTP請(qǐng)求到服務(wù)器

基于HTTP網(wǎng)頁(yè)服務(wù)器和UDP上位機(jī)的MJPG碼流傳輸
基于LwIP的HTTP服務(wù)器設(shè)計(jì)

Qt通過(guò)QtWebApp開(kāi)發(fā)HTTP服務(wù)器

HTTP服務(wù)器項(xiàng)目實(shí)現(xiàn)介紹

如何利用AWFlow搭建HTTP服務(wù)器

使用NS1串口服務(wù)器HTTP模式上傳服務(wù)器數(shù)據(jù)

評(píng)論