Aufgaben festlegen.
Das Projekt soll die Möglichkeit implementieren, Berichte über den Betrieb von Einrichtungen (Tankstellen) für Kunden zu erhalten, die keinen vollwertigen Teil der Implementierung der Back-Office-Komponente haben, um Betriebsinformationen zu überwachen und zu erhalten Betrieb von Tankstellen.
Für die Umsetzung des Projektes wurde folgende Lösung gewählt:
- Erstellung eines WEB-Servers, der sich in einem Netzwerksegment mit Zugriff auf die Tankstellendatenbank befindet, um Abfragen zu erstellen und Berichte basierend auf Vorlagen anzuzeigen, der Server muss auch mit Zugriff auf Endkunden zum Empfangen von Berichten versehen sein;
- Erstellung einer Datenbank und Organisation auf der Grundlage eines persönlichen Kontos des Benutzers;
- Erstellen eines Dienstprogramms zum Einrichten und Verwalten eines Webservers und des persönlichen Kontos eines Benutzers.
Als Datenbanken werden Firebird in der aktuellen Version 3.0.4 verwendet. Zur Entwicklung und Verwaltung der Datenauswahl und -änderung verwenden wir die GUI-Shell IBExpert . Die neueste kostenlose Vollversion kann unter link. heruntergeladen werden.
Die Version ist für Windows-Betriebssysteme, funktioniert aber gut unter Linux mit WINE .
Um mit der Datenbank in Qt zu arbeiten, verwenden wir den [QIBASE]-Datenbanktreiber (https://doc.qt.io/qt-5/sql-driver.html#qibase), die Treiber-Assemblierung wird [hier] beschrieben ( https://evileg.com/post/356/).
Um den WEB-Server zu implementieren, verwenden wir die Bibliothek QtWebApp . Beschreibung der Bibliothek, Schulungsmaterialien zu ihrer Verwendung sind auf der Website von [Entwickler] verfügbar (http://stefanfrings.de/qtwebapp/index-de.html).
Erstellen Sie ein Projekt.
Da das Projekt aus zwei Anwendungen bestehen wird, erstellen wir ein neues Projekt mit Unterverzeichnissen.
Unterprojekte hinzufügen. Konsolenanwendung MPosWebReport .
Jetzt fügen wir ein Unterprojekt hinzu, um den Server und das persönliche Konto des Benutzers MPosWebAdmin zu verwalten. Eine typische Qt-Widgets-Anwendung, die auf QMainWindow basiert.
Die Projektstruktur sieht jetzt so aus.
Erstellen Sie ein Repository auf GitHub und laden Sie dort ein leeres Projekt hoch.
git remote add origin git@github.com:rust3128/MposWebServer.git git commit git push -u origin master
Hinzufügen der QtWebApp-Bibliothek.
Laden Sie QtWebApp herunter, entpacken Sie das Archiv und kopieren Sie den QtWebApp-Ordner in den Projektordner. Wir erhalten folgende Ordnerstruktur:
Wir fügen der Projektdatei MPosWebServer.pro Zeilen hinzu, um das Netzwerk zu unterstützen und den Quellcode der Bibliothek zu verbinden.
QT += network include(../QtWebApp/httpserver/httpserver.pri)
Außerdem erstellen wir gemäß den Empfehlungen des Bibliotheksentwicklers die Konfigurationsdatei
../etc/MPosWebServer.ini
und fügen sie beiden Teilprojekten hinzu.
MPosWebServer.ini
[listener] ;host=192.168.0.100 port=8080 minThreads=4 maxThreads=100 cleanupInterval=60000 readTimeout=60000 maxRequestSize=16000 maxMultiPartSize=10000000
Host und Port - IP und Port, auf dem Anfragen verarbeitet werden. Wenn Sie den Host-Parameter auskommentieren, werden alle Netzwerkschnittstellen des Servers abgehört.
minThread minimale Anzahl von Worker-Threads im Leerlauf, um HTTP-Anforderungen zu verarbeiten.
maxThread maximale Anzahl von Worker-Threads, die erstellt werden, wenn HTTP-Anforderungen eintreffen.
cleanupInterval in Millisekunden gibt an, wie lange der kostenlose Stream geschlossen wird.
readTimeout Zeit in Millisekunden, nach der eine unbenutzte Verbindung zum Server geschlossen wird.
maxRequestSize maximale Größe einer einfachen Anfrage.
maxMultiPartSize ist der maximale mehrteilige Anforderungswert, der auftritt, wenn ein Webbrowser eine Datei auf den Server hochlädt.
Lassen Sie uns den Quellcode der mit der Bibliothek gelieferten Beispiele sowie Beispiele aus der Dokumentation verwenden, um die Leistung zu überprüfen.
Hinzufügen der HelloWorldController-Klasse zum MPosWebReport-Projekt
helloworldcontroller.h:
#ifndef HELLOWORLDCONTROLLER_H #define HELLOWORLDCONTROLLER_H #include "httprequesthandler.h" using namespace stefanfrings; class HelloWorldController : public HttpRequestHandler { Q_OBJECT public: HelloWorldController(QObject *parent = nullptr); // HttpRequestHandler interface public: void service(HttpRequest &request, HttpResponse &response); }; #endif // HELLOWORLDCONTROLLER_H
helloworldcontroller.cpp:
#include "helloworldcontroller.h" HelloWorldController::HelloWorldController(QObject *parent) : HttpRequestHandler(parent) { } void HelloWorldController::service(HttpRequest &request, HttpResponse &response) { response.write("Hello World",true); }
Ändern Sie main.cpp:
#include <QCoreApplication> #include <QDir> #include <QFile> #include "httplistener.h" #include "httprequesthandler.h" #include "helloworldcontroller.h" using namespace stefanfrings; /** Функция поиска конфигурационного файла */ QString searchConfigFile() { QString binDir=QCoreApplication::applicationDirPath(); QString appName=QCoreApplication::applicationName(); QString fileName(appName+".ini"); QStringList searchList; searchList.append(binDir); searchList.append(binDir+"/etc"); searchList.append(binDir+"/../etc"); searchList.append(binDir+"/../../etc"); // for development without shadow build searchList.append(binDir+"/../"+appName+"/etc"); // for development with shadow build searchList.append(binDir+"/../../"+appName+"/etc"); // for development with shadow build searchList.append(binDir+"/../../../"+appName+"/etc"); // for development with shadow build searchList.append(binDir+"/../../../../"+appName+"/etc"); // for development with shadow build searchList.append(binDir+"/../../../../../"+appName+"/etc"); // for development with shadow build searchList.append(QDir::rootPath()+"etc/opt"); searchList.append(QDir::rootPath()+"etc"); foreach (QString dir, searchList) { QFile file(dir+"/"+fileName); if (file.exists()) { // Файл нашли fileName=QDir(file.fileName()).canonicalPath(); qDebug("Using config file %s",qPrintable(fileName)); return fileName; } } // не нашли foreach (QString dir, searchList) { qWarning("%s/%s not found",qPrintable(dir),qPrintable(fileName)); } qFatal("Cannot find config file %s",qPrintable(fileName)); return nullptr; } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); a.setApplicationName("MPosWebServer"); a.setOrganizationName("RustSoft"); // Ищем конфигурационный файл QString configFileName=searchConfigFile(); // Читаем настройки сервера QSettings* listenerSettings=new QSettings(configFileName, QSettings::IniFormat, &a); listenerSettings->beginGroup("listener"); // Запуск HTTP сервера new HttpListener(listenerSettings,new HelloWorldController(&a),&a); return a.exec(); }
Wir starten das Projekt.
Folgen Sie im Browser dem Link http://localhost:8080
Wir bekommen:
In diesem Teil wurden hauptsächlich die Inhalte der QtWebApp-Bibliotheks-Tutorials verwendet.
Das Thema ist neu für mich und daher interessant. Für Kommentare und Anmerkungen bin ich sehr dankbar.
Projektarchiv
MposWebServer01.zip
Чего не webassembly?
Да так, посмотрел библиотеку попробовал примеры...