<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Qt通過QtWebApp開發HTTP服務器

Rice嵌入式開發技術分享 ? 來源:Rice 嵌入式開發技術分享 ? 作者:Rice 嵌入式開發技 ? 2023-06-26 08:38 ? 次閱讀
  1. RTools工具是之前開源的一個工具,其目的是將平時要用到的工具集成在一起,方便使用;也有一段時間沒有更新新功能了。本次新功能增加的同時,UI重構了一遍。更加方面快捷,后續將不斷新增加功能。
ca74294e-13b9-11ee-9c1d-dac502259ad0.png
  1. 在實際項目開發中HTTP是我們經常使用的,嵌入式設備往往作為客戶端,而服務器一般都是部署在云端等設備上,這對于調試過程其實是很不方便的,其實網上也有更多工具可以在自己的PC上一鍵部署為HTTP服務器。例如:MyWebServer工具。
ca8b955c-13b9-11ee-9c1d-dac502259ad0.png
  1. 雖然有像MyWebServer工具這么方便的工具,但是對于博主來說,還是不太便捷的,又要打開一個工具,所以想著將MyWebServer工具的功能集成到RTools中。
  2. 通過搜索一遍,Qt有一個比較好的Http服務器庫--QtWebApp。
ca97f7fc-13b9-11ee-9c1d-dac502259ad0.png

什么是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,解壓之后的工程目錄如下圖:

caabccaa-13b9-11ee-9c1d-dac502259ad0.png

RTools增加WebServer

移植流程

  1. 將QtWebApp的庫移植到我們的工程中,庫的路徑:xxxQtWebAppQtWebApphttpserver,將目錄下的所有文件拷貝到我們工程目中,添加的方式有兩種:①使用工程加入子工程的方式,②將QtWebApp的庫文件手動添加到工程中,博主選擇第②種方式,為了歸類代碼模塊。
cab66bd8-13b9-11ee-9c1d-dac502259ad0.png
  1. 在RTools工程中添加一個httpServer的資源文件:httpServer.ini。配置文件參數說明:
cac80c3a-13b9-11ee-9c1d-dac502259ad0.png
  • host和post:代表web服務器的IP地址和端口。公用Web服務器使用端口80,而內部Web服務器通常在端口8080上偵聽。
  • minThreads:代表始終保持運行的線程數量,用來確保一段時間不活動后的良好響應時間。
  • maxThreads:QtWebApp可以同時處理多個http請求,該參數指定并發工作線程的最大數量。其值要根據機器性能而定(可以利用負載生成器等工具來確定)。
  • cleanupInterval:Web服務器始終以空線程池開頭,當HTTP請求進入時,將根據需要創建線程??臻e線程由計時器緩慢關閉。每隔一個cleanupInterval時間間隔(以毫秒為單位),服務器都將關閉一個空閑線程。
  • readTimeout:設置通過打開大量連接而不使用它們,來保護服務器免受簡單的拒絕服務攻擊。靜默連接將在設定的毫秒數后被關閉。通常情況下,是由Web瀏覽器來關閉連接。
  • maxRequestSize:保護服務器免受非常多的HTTP請求而導致內存過載的影響。此值適用于常規請求。
  • maxMultiPartSize:適用于網絡瀏覽器將文件上傳到服務器時發生的大部分請求。如果要接受10 MB的文件,由于HTTP協議開銷,必須將此值設置得更大一些。

開發WebServer功能

  1. 創建一個類: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_OBJECT
public:
HttpServer(QObject*parent=nullptr);
HttpServer(QStringpath);

voidservice(HttpRequest&request,HttpResponse&response);
private:
QStringbasePath;
};

#endif//HTTPSERVER_H
  1. 創建一個類、帶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");
}
  1. 啟動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)");
.......
}
  1. 關閉WebServer,①關閉http監聽,②刪除http監聽對象
voidWebServerTool::httpStopListener()
{
if(httpListener!=nullptr)
{
httpListener->close();
deletehttpListener;
httpListener=nullptr;
}

ui->buttonHttpStart->setText("啟動(Start)");
....
}

驗證WebServer功能

  1. 電腦的某個目錄創建一個文件:RToolTest.txt(任意命名),并在文件中添加一些內容:
cad60e98-13b9-11ee-9c1d-dac502259ad0.png
  1. 打開RTools,選擇WebServer工具,選擇服務目錄為存放文件RToolTest.txt的目錄。選擇電腦的IP,和設置端口號,并點擊啟動。
cae7a86a-13b9-11ee-9c1d-dac502259ad0.png
  1. 驗證:我在虛擬機中的ubuntu中,采用wget進行獲取文件內容:執行命令如下:
wgethttp://IP:PORT/RToolTest.txt
  • 當服務目錄下存在我們請求的文件,執行結果:
caf947fa-13b9-11ee-9c1d-dac502259ad0.png
  • 當服務目錄下不存在我們請求的文件,執行結果:
cb08e336-13b9-11ee-9c1d-dac502259ad0.png

總結

  1. 本次博主開發新版本的RTools中集成了Jlink tool和web server tool,后續將不斷新增加功能
  2. web server tool目前只支持http,不支持https功能,博主將在后面開發完畢。

cb126f6e-13b9-11ee-9c1d-dac502259ad0.png


審核編輯黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    8271

    瀏覽量

    83040
  • HTTP
    +關注

    關注

    0

    文章

    467

    瀏覽量

    30403
  • Qt
    Qt
    +關注

    關注

    1

    文章

    299

    瀏覽量

    37438
收藏 人收藏

    評論

    相關推薦

    基于HTTP網頁服務器和UDP上位機的MJPG碼流傳輸

    本文采用的硬件板卡為飛凌嵌入式OKMX8MP-C開發板,系統版本Linux5.4.70+Qt5.15.0,主要介紹基于HTTP網頁服務器和UDP上位機的MJPG碼流傳輸。
    發表于 06-09 11:27 ?1532次閱讀

    Linux開發_CentOS7.4服務器搭建NFS、NGINX服務器,安裝ffmpeg、Qt環境

    在CentOS7.4服務器版本的環境下搭建NFS服務器、安裝ffmpeg、安裝nginx服務器、部署Qt編譯環境。
    的頭像 發表于 07-14 13:45 ?1174次閱讀
    Linux<b class='flag-5'>開發</b>_CentOS7.4<b class='flag-5'>服務器</b>搭建NFS、NGINX<b class='flag-5'>服務器</b>,安裝ffmpeg、<b class='flag-5'>Qt</b>環境

    labview如何通過http協議上傳數據至web服務器

    本人小白,對網絡和通訊都是菜鳥。最近在學習labview如何通過http協議上傳數據至web服務器,這個web服務器是一般構建的服務器,不是
    發表于 10-30 17:28

    labview如何通過http協議post方法上傳數據至web服務器

    各位前輩好: 本人小白,對網絡和通訊都是菜鳥。 最近有個小程序,要用labview通過http協議post方法上傳數據至web服務器(請求和響應的格式見圖片),這個web服務器是用C語
    發表于 06-12 09:44

    OPC服務器開發淺談 — 服務器模型

    這里主要討論的是OPC Data Access 2.0服務器開發,在掌握了這個最常用的OPC服務器開發之后,對其它類型的OPC服務器,如A
    發表于 07-02 08:29

    使用NodeMCU創建一個簡單的HTTP服務器

    我正在嘗試使用NodeMCU創建一個簡單的HTTP服務器 . 我啟動nodeMCU然后將其連接到wifi,然后運行下面的程序 . 我可以從瀏覽連接到服務器 . 如果我繼續重新加載頁面
    發表于 11-01 06:03

    什么是Boa服務器

    嵌入式web服務器Boa的移植什么是Boa服務器BOA 服務器是一個小巧高效的web服務器,是一個運行于unix或linux下的,支持CGI的、適合于嵌入式系統的單任務的
    發表于 12-14 07:21

    HTTP OTA webclient獲取不到服務器如何處理?

    嘗試用HTTP_OTA的方式來升級程序,按照網上的資料搭建程序,在http_ota.c中現在遇到Webclient獲取不到服務器的情況:找不到服務器
    發表于 05-19 10:43

    如何基于HTTP Web服務器示例實現TLS HTTPS服務器?

    我正在嘗試基于此 HTTP Web 服務器示例實現 TLS HTTPS 服務器:https://github.com/STMicroelectronics/x-cube-azrtos-h7/tree
    發表于 01-04 06:23

    如何通過http請求將值發送到服務器?

    我正在使用 nodemcu 創建一個網絡服務器。我想通過 http 請求將值發送到服務器。我已成功創建服務器并在 Windows 上使用 f
    發表于 02-27 06:48

    如何將.txt 大文件發送到HTTP服務器?

    我在 SPIFFS 閃存中創建了多個 .txt 文件系統。但是如何將 .txt 大文件發送到 HTTP 服務器,可以通過 ESP8266 12F 將 SPIFFS 1MB 文件發送到上傳 HT
    發表于 05-19 09:00

    HTTP服務器使用uIP TCP/ IP堆棧的示例

    EC_ M480_ uIP_ HTTP_Led_V1. 00 顯示 HTTP 服務器, 網頁非常簡單 。 HTTP 客戶端, 例如 IE 或 Chrome , 可以
    發表于 08-22 07:07

    基于HTTP網頁服務器和UDP上位機的MJPG碼流傳輸

    本文采用的硬件板卡為飛凌嵌入式OKMX8MP-C開發板,系統版本Linux5.4.70+Qt5.15.0,主要介紹基于HTTP網頁服務器和UDP上位機的MJPG碼流傳輸。
    發表于 01-23 12:05 ?639次閱讀

    Qt通過QtWebApp開發HTTP服務器

    RTools工具是之前開源的一個工具,其目的是將平時要用到的工具集成在一起,方便使用;也有一段時間沒有更新新功能了。本次聯合風火輪科技,UI重構了一遍。更加方面快捷,后續將不斷新增加功能。
    的頭像 發表于 06-25 10:17 ?1793次閱讀
    <b class='flag-5'>Qt</b><b class='flag-5'>通過</b><b class='flag-5'>QtWebApp</b><b class='flag-5'>開發</b><b class='flag-5'>HTTP</b><b class='flag-5'>服務器</b>

    如何利用AWFlow搭建HTTP服務器

    本文將基于EsDA開發套件快速在開發板上搭建HTTP服務器,為HTTP客戶端提供了訪問板子的外設資源,數據以及文件讀寫等接口,實現設備與網絡
    的頭像 發表于 12-14 08:24 ?276次閱讀
    如何利用AWFlow搭建<b class='flag-5'>HTTP</b><b class='flag-5'>服務器</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>