RTools工具是之前開源的一個工具,其目的是將平時要用到的工具集成在一起,方便使用;也有一段時間沒有更新新功能了。本次聯(lián)合風火輪科技,UI重構了一遍。更加方面快捷,后續(xù)將不斷新增加功能。
在實際項目開發(fā)中HTTP是我們經(jīng)常使用的,嵌入式設備往往作為客戶端,而服務器一般都是部署在云端等設備上,這對于調(diào)試過程其實是很不方便的,其實網(wǎng)上也有更多工具可以在自己的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服務器在并發(fā)線程中處理傳入請求。它支持持久連接、HTTPS、會話cookie和文件上傳。
其中包括一個簡單的支持多種語言的模板引擎,它用運行時值填充文本文件中的占位符。模板引擎還支持條件輸出和循環(huán)。其他更大的模板引擎,如ClearSilver,也可以用作替代方案。
記錄器插入Qt,并將日志消息從qDebug(…)重定向到qFatal(…)到文件,同時還添加了時間戳、線程ID、會話ID等附加屬性。對記錄器配置文件的更改將自動變?yōu)榛顒訝顟B(tài),而無需重新啟動程序。
QtService組件使您能夠?qū)贸绦蛟O置為Windows服務。
大約2MB的小內(nèi)存需求使web服務器有資格用于嵌入式系統(tǒng)。但對于更大的網(wǎng)絡服務來說,它也足夠強大。
有關如何使用庫的教程,請參閱: 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。配置文件參數(shù)說明:
host和post:代表web服務器的IP地址和端口。公用Web服務器使用端口80,而內(nèi)部Web服務器通常在端口8080上偵聽。
minThreads:代表始終保持運行的線程數(shù)量,用來確保一段時間不活動后的良好響應時間。
maxThreads:QtWebApp可以同時處理多個http請求,該參數(shù)指定并發(fā)工作線程的最大數(shù)量。其值要根據(jù)機器性能而定(可以利用負載生成器等工具來確定)。
cleanupInterval:Web服務器始終以空線程池開頭,當HTTP請求進入時,將根據(jù)需要創(chuàng)建線程??臻e線程由計時器緩慢關閉。每隔一個cleanupInterval時間間隔(以毫秒為單位),服務器都將關閉一個空閑線程。
readTimeout:設置通過打開大量連接而不使用它們,來保護服務器免受簡單的拒絕服務攻擊。靜默連接將在設定的毫秒數(shù)后被關閉。通常情況下,是由Web瀏覽器來關閉連接。
maxRequestSize:保護服務器免受非常多的HTTP請求而導致內(nèi)存過載的影響。此值適用于常規(guī)請求。
maxMultiPartSize:適用于網(wǎng)絡瀏覽器將文件上傳到服務器時發(fā)生的大部分請求。如果要接受10 MB的文件,由于HTTP協(xié)議開銷,必須將此值設置得更大一些。
開發(fā)WebServer功能
創(chuàng)建一個類:HttpServer,繼承HttpRequestHandler,該類重寫了service方法,我們(風火輪科技:https://www.youyeetoo.com/)開發(fā)該工具的目的是支持客戶端可以通過wget獲取文件。類的內(nèi)容如下:
httpserver.cpp內(nèi)容:構造函數(shù)設置指定服務目錄;service方法實現(xiàn)將文件內(nèi)容傳輸給客戶端,如果文件不存在則返回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內(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)建一個類、帶UI的:webservertool。
在構造函數(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"); }
啟動WebServer,①獲取http服務目錄,②根據(jù)用戶設置host(服務器IP)和port(服務器端口號)更新監(jiān)聽配置,然后創(chuàng)建http監(jiān)聽
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啟動監(jiān)聽失敗"); } else { ui->textBrowserHttpLog->append("Http啟動監(jiān)聽成功"); } ui->buttonHttpStart->setText("停止(Stop)"); ....... }
關閉WebServer,①關閉http監(jiān)聽,②刪除http監(jiān)聽對象
voidWebServerTool::httpStopListener() { if(httpListener!=nullptr) { httpListener->close(); deletehttpListener; httpListener=nullptr; } ui->buttonHttpStart->setText("啟動(Start)"); .... }
驗證WebServer功能
在電腦的某個目錄創(chuàng)建一個文件:RToolTest.txt(任意命名),并在文件中添加一些內(nèi)容:
打開RTools,選擇WebServer工具,選擇服務目錄為存放文件RToolTest.txt的目錄。選擇電腦的IP,和設置端口號,并點擊啟動。
驗證:我在虛擬機中的ubuntu中,采用wget進行獲取文件內(nèi)容:執(zhí)行命令如下:
wgethttp://IP:PORT/RToolTest.txt
當服務目錄下存在我們請求的文件,執(zhí)行結果:
當服務目錄下不存在我們請求的文件,執(zhí)行結果:
總結
本次聯(lián)合風火輪科技開發(fā)新版本的RTools中集成了Jlink tool和web server tool,后續(xù)將不斷新增加功能
web server tool目前只支持http,不支持https功能,博主將在后面開發(fā)完畢。
審核編輯:湯梓紅
-
服務器
+關注
關注
12文章
8958瀏覽量
85085 -
HTTP
+關注
關注
0文章
499瀏覽量
30980 -
開源
+關注
關注
3文章
3215瀏覽量
42329 -
Qt
+關注
關注
1文章
301瀏覽量
37786
原文標題:Qt通過QtWebApp開發(fā)HTTP服務器
文章出處:【微信號:風火輪技術團隊,微信公眾號:風火輪技術團隊】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論