Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   WebServer (https://www.delphipraxis.net/211718-webserver.html)

himitsu 26. Okt 2022 17:26

AW: WebServer
 
Für Windows eigentlich WAMP ... hieß es mal, aber XAMPP ist dennoch gut.
Und sowieso installiert man sich natürlich den IIS.


Vor Jahren mal eine App in den Fingern gehabt ... finde sie nicht mehr ... irgendwas mit Me oder We oder :gruebel:
Egal, war sowas wie USBWebServer oder Server2Go ... halt eine Eierlegendewollmilchsauapp, wo Webbrowser, PHP und MySQL integriert waren ... eine EXE ohne Installation, z.B. für Dinge auf CD oder USB.

bernau 26. Okt 2022 19:52

AW: WebServer
 
Zitat:

Zitat von lucy (Beitrag 1513901)
habe aber einfach Lust was mit Delphi zu machen.

Das kenne ich :thumb:

Phoenix 26. Okt 2022 20:31

AW: WebServer
 
Zitat:

Zitat von Rollo62 (Beitrag 1513910)
Ok, ich weiss: Eigentlich sollte man doch bitteschön was "Docker"-mäßiges Verwenden, das ist ja sooo cool.

Eigentlich ein bissel offtopic, daher nur ganz am Rande:
Docker benutzt man nicht weil es cool ist, sondern weil es als Werkzeug für das richtige Problem angewendet echt saumäßig viel Arbeit (und damit Geld) und vor allem auch Betriebskosten einsparen kann. Das ist eher was für größere Businesses die aktuell im Betrieb mit zig VM's hantieren und wo da Patch-Management und Rollouts etc. echt kompliziert und teuer werden.
Und als Entwicklungs-Plattform für jemanden der mit vielen unterschiedlichen Kunden-Umgebungen arbeiten muss (wie z.B. für mich :stupid:) ist es auch klasse, weil ich da einfach für jeden Kunden die entsprechende SQL-Server oder Oracle-Version mit den Daten isoliert in einem Container liegen habe, und das nur mit einem Kommando hochfahren brauche wenn ich mal auf dem Projekt bin.

Wieder on-topic @Lucy:
Ein Webserver ist vielleicht nicht gerade das einfachste Projekt das man sich vorstellen kann. Vor allem nicht, wenn man ihn wirklich auf der Ebene implementieren möchte (okay, es geht natürlich noch tiefer, aber das wäre dann echt erstmal die komplette HTTP-Spezifikation durchimplementieren).

Delphi als Entwicklungsplattform hat, genau wie andere Toolsets, eine gewisse Abstraktionshöhe von der bare-metal Technik. Es macht einen Entwickler bei GUI-Anwendungen super-produktiv. Deswegen würde man in aller Regel auch z.B. keine Low-Level Treiber in Delphi schreiben sondern eher in C/C++ oder moderner in Rust oder Go.
Genauso würde man sich in C/C++ aber eher die Finger wundschreiben wenn es um Webserver oder APIs geht. Dort sind dann die Abstraktionsschickten in Rust oder Go wiederum vorhanden oder man greift zu .NET (oder Java... brrr), weil dort die vorhandenen Netzwerk-Geschichten schon so geil sind das man hier super-Produktiv ist.

Das Beispiel mit dem vollständigen Webserver (inkl. CSS, JS, Bildern, Videos, Binärformaten etc.) ist in modernem .NET 7 vermutlich irgendwas zwischen 3 und 5 Zeilen. Also wirklich Komplett, Production-Ready und sicher im Internet zu betreiben. Das kann man dann auf Linux, Windows, macOS betreiben und mit einem Dockerfile dazu auch unmittelbar containerisieren.

Kurzum: Willst Du was mit Delphi machen, dann mache vielleicht eher was, wo Delphi wirklich das richtige Tool für ist. Wenn Du Web-Sachen bauen willst, dann nimm eher Tools die einen Entwickler dort saumäßig Produktiv machen. Und: Immer mal wieder über den Tellerrand gucken :thumb:

Delphi.Narium 26. Okt 2022 21:56

AW: WebServer
 
Naja, einen WebServer von grundauf selbstmachen, ist ja vielleicht nicht die Vorstellung des Threaderstellers.

Aber bei den Indys ist eine HTTPServerkomponente bei, die einem das Grundgerüst eines Webservers liefert.

In früheren Zeiten, als bei den Indys (Indy 6) noch Demos dabei waren, hatten sie auch 'nen funktionsfähigen Webserver dabei. Den kann man bestimmt erstmal als Grundlage nehmen.

CGI-Programme kann man mit Hilfe des CGI Runner (zu finden bei GitHub) einbinden.

Alternativ schaue man sich bei SourceForge um. Da gibt's auch 'ne Version vom TIDCGIRunner und dazu auch noch den TIDIAspiRunner, um auch ISAPI.dlls nutzen zu können.

Ist zwar alles schon ein bisserl älter, aber als Herausforderung sicherlich geeignet.

Um dynamische HTML-Seiten, auch aus Datenbanken, zu erstellen, gibt es TPageProducer und TDataSetPageProducer, damit wird es (fast) banal einfach Datenbankinhalte per mit Delphi erstelltem WebServer an beliebige Clients zu liefern.

Ok, am Anfang hat man sicherlich etliches zu lernen, um zu verstehen, wie das Ganze funktioniert. Aber hat man den am Anfang sehr flachen Anstieg der Lernkurve hinter sich gebracht, wird es recht einfach.

Und das Schöne ist, man kann sich sogar 'nen WebServer mit 'ner Delphioberfläche erstellen. Es muss nicht zwingend ein Dienst sein, der über kryptische Konfigurationsdateien "gemanaged" wird oder nur über eine Weboberfläche zu bedienen ist, ...

Mein so erstellter Webserver funktioniert inzwischen seit fast 10 Jahren problemlos. Natürlich ist er nur für den lokalen Einsatz oder sehr kleine Netzwerken geeignet. Ab so als Hobbyprojekt, so einfach aus Neugier, ist's ausreichend.

PS.:

Der Quelltext im Eingangspost enthält übrigens alles wesentliche bereits.

Zur Erfüllung aller weiteren Wünsche, muss "nur" eine passende IF-Cascade um
Delphi-Quellcode:
if ARequestinfo.Document='/' then
gebaut werden.

Letztlich muss für jede mögliche Anforderung an den Webserver, von Seiten der Clients, eine entsprechender IF-Zweig implementiert werden.

Im Endeffekt muss "nur" die Methode
Delphi-Quellcode:
procedure TForm1.ServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
aufgebohrt werden.

Bilder, CSS, ... kann man auf die gleiche Weise ausliefern. Datei in 'nen Stream laden und den "rausrücken".
Man braucht halt ein bisserl Gehirnschmalz und ein sinnvolles Konzept, wie man aus den in der Url angegebenen Dateinamen und Parametern auf die physikalisch auf der Festplatte vorliegende Dateien übersetzt. Sprich: Man muss die Filestruktur, die in der Url abgebildet wird, auf eine entsprechende Filestruktur auf einem Datenträger abbilden (oder umgekehrt).

Für dynamische Seiten muss man ebenfalls die Url auswerten und dann entsprechend den dort angegebenen Paramtern den dynamischen Seiteninhalt erstellen (TPageProducer, TDatSetPageProducer). Der TDataSetPageProducer produziert aus einem beliebigen Abfrageergebnis eines SQL-Statements eine HTML-Tabelle, analog zu 'nem DBGrid. Natürlich kann man sich für dynamische Webseiten Templates hinterlegen, die man dann von den beiden genannten Komponenten zur Laufzeit um einsprechende Inhalte ergänzt. Das läuft alles ereignisgesteuert, so dass man da keine Templates selbst parsen muss, um die Inhalte an die passende Stelle zu bekommen.

Grob gesagt: WebServer mit Delphi erstellen: Geht.

DeddyH 27. Okt 2022 07:05

AW: WebServer
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1513921)
Grob gesagt: WebServer mit Delphi erstellen: Geht.

Man kann auch mit einem Hammer eine Schraube in die Wand bekommen. Die Frage ist nur, ob das das optimal geeignete Werkzeug für diese Aufgabe ist. Und wenn es schon Delphi sein muss, würde ich mich nicht selbst kasteien, sondern lieber auf entsprechende Frameworks zurückgreifen (dieses TMS-Dings, mORMot, DMVC, MARS Curiosity etc.).

hhcm 27. Okt 2022 07:33

AW: WebServer
 
Zitat:

dieses TMS-Dings
:-D

Mit dem TMS-Dings kann man aber auch keinen PHP Interpreter ersetzen. (oder doch?)

himitsu 27. Okt 2022 08:22

AW: WebServer
 
Klar kann man überall intern auch PHP aufrufen.
PHP ist diesbezüglich nichts Anderes, wie Python, PowerShell, Batch, PascalScript ........


PHP4Delphi/RadPHP (k.A. wie weit auch HTML5 Builder) war reines PHP mit JavaScript, was man im PascalStyle mit vcl-ähnlichen Komponenten nutzen konnte.

Aber wer sagt denn das es PHP sein?
Wenn man unbedingt was mit Delphi machen will, dann schreibt man den Code in der delphi-language und lässt sich davon dann HTML erzeugen/ausgeben.

Ansonsten nimmt man was Anderes, was direkt PHP kann und eben kein Delphi ... OK, abgesehn von vielleicht einem Modul (Erweiterung) im PHP-Server oder sowas wie CGI im HTTP-Server.
Nur wenn man extrem pervers masochistisch veranlagt ist, dann schreibt man seinen eigenen PHP-Interpreter.

Delphi.Narium 27. Okt 2022 10:05

AW: WebServer
 
Zitat:

Zitat von DeddyH (Beitrag 1513925)
Zitat:

Zitat von Delphi.Narium (Beitrag 1513921)
Grob gesagt: WebServer mit Delphi erstellen: Geht.

Man kann auch mit einem Hammer eine Schraube in die Wand bekommen. Die Frage ist nur, ob das das optimal geeignete Werkzeug für diese Aufgabe ist. Und wenn es schon Delphi sein muss, würde ich mich nicht selbst kasteien, sondern lieber auf entsprechende Frameworks zurückgreifen (dieses TMS-Dings, mORMot, DMVC, MARS Curiosity etc.).

Es geht doch garnicht darum ein optimales Werkzeug für was auch immer zu finden, sondern darum zu versuchen, ob es geht. Zumindest verstehe ich die Aufgabenstellung im Eingangsthread so.

Und nein, wenn man's mit reinem Delphi und den Indykomponenten macht, muss man sich nicht kasteien.
Delphi-Quellcode:
     
      sFilename := Format('%s%s',['htdocs',ARequestinfo.Document]);
      if FileExists(sFilename) then
      begin
        Stream:=TFileStream.Create(sFilename, fmOpenRead or fmShareDenyWrite);
      end
      else
      begin
        Stream:=TFileStream.Create('htdocs/index.html', fmOpenRead or fmShareDenyWrite);
      end;
      // Hier muss man noch den ContentType abhängig von dem Dateityp, setzen.
      AResponseinfo.ContentType:='text/html';
      AResponseinfo.ContentStream:=Stream;
      setlength(Groesse, Stream.Size);
      Stream.Read(Groesse[1], Stream.Size);
      Memo1.Lines.Add(datetostr(date) + ' | ' + timetostr(time) + ': Client ' + ARequestinfo.RemoteIP + ' hat die Datei ' + sFilename + ' (' + inttostr(round(Stream.Size /1024)) + 'kb) angefordert.');
Damit kann man dann auch CSS, Bilder, und was sonst noch so alles auf der Festplatte rumliegt, ausliefern.

CGI-Programme ruft man mit dem TIDCGIRunner im Prinzip in der Form auf:

Delphi-Quellcode:
CGIRunner.Execute(ARequestinfo.Document,AContext,RequestInfo,ResponseInfo,Action);


Ist also auch "nur" ein Einzeiler, geht auch mit .bat, .cmd, .pl für Perl, ..., ist ähnlich simpel wie ShellExecute.

Und ja: Als professionelle Lösung nicht geeignet, aber ist die hier gefordert?

DeddyH 27. Okt 2022 10:50

AW: WebServer
 
Sorry, mir war nicht bekannt, dass man in diesem Forum nicht mehr auf alternative Lösungen verweisen darf.

Delphi.Narium 27. Okt 2022 11:02

AW: WebServer
 
Es ging mir nicht um alternative Lösungen sondern um
Zitat:

Zitat von DeddyH
Man kann auch mit einem Hammer eine Schraube in die Wand bekommen.



Alle Zeitangaben in WEZ +1. Es ist jetzt 05:44 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz