(相關資料圖)
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功能,博主將在后面開發完畢。審核編輯黃宇
關鍵詞: