AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

WebServer

Ein Thema von lucy · begonnen am 26. Okt 2022 · letzter Beitrag vom 27. Okt 2022
Antwort Antwort
Seite 1 von 2  1 2      
Delphi.Narium

Registriert seit: 27. Nov 2017
2.578 Beiträge
 
Delphi 7 Professional
 
#1

AW: WebServer

  Alt 26. Okt 2022, 21:56
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 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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#2

AW: WebServer

  Alt 27. Okt 2022, 07:05
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.).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hhcm

Registriert seit: 12. Feb 2006
Ort: Wegberg
310 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: WebServer

  Alt 27. Okt 2022, 07:33
Zitat:
dieses TMS-Dings


Mit dem TMS-Dings kann man aber auch keinen PHP Interpreter ersetzen. (oder doch?)
Chris
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.506 Beiträge
 
Delphi 12 Athens
 
#4

AW: WebServer

  Alt 27. Okt 2022, 08:22
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.578 Beiträge
 
Delphi 7 Professional
 
#5

AW: WebServer

  Alt 27. Okt 2022, 10:05
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:

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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#6

AW: WebServer

  Alt 27. Okt 2022, 10:50
Sorry, mir war nicht bekannt, dass man in diesem Forum nicht mehr auf alternative Lösungen verweisen darf.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.578 Beiträge
 
Delphi 7 Professional
 
#7

AW: WebServer

  Alt 27. Okt 2022, 11:02
Es ging mir nicht um alternative Lösungen sondern um
Zitat von DeddyH:
Man kann auch mit einem Hammer eine Schraube in die Wand bekommen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#8

AW: WebServer

  Alt 27. Okt 2022, 11:15
Lies Dir doch Phoenix' Beitrag noch einmal durch und vergleiche den Aufwand. Darauf wollte ich mit meinem Hammer-Vergleich hinaus. Dass diese Delphi-Programmierer immer gleich Schnappatmung bekommen müssen...
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.578 Beiträge
 
Delphi 7 Professional
 
#9

AW: WebServer

  Alt 27. Okt 2022, 11:38
Der von Phoenix beschriebene Aufwand entspricht meiner Erfahrung nach nicht der Realität.

Man muss keine HTTP-Spezifikation durchimplementieren, ... (das ist in den INDY-Komponenten alles schon enthalten).
Zitat von Phoenix:
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.
In meinem obigen Beispiel sind's halt keine 3 bis 5 Zeilen, sondern 13.

Man könnte es auch noch verkürzen:
Delphi-Quellcode:
sFilename := Format('%s%s',['htdocs',ARequestinfo.Document]);
if not FileExists(sFilename) then sFilename := 'htdocs/index.html';
Stream := TFileStream.Create(sFilename, fmOpenRead or fmShareDenyWrite);
// Hier muss man noch den ContentType abhängig von dem Dateityp, setzen.
AResponseinfo.ContentType := 'text/html';
AResponseinfo.ContentStream := Stream;
Delphi-Quellcode:
procedure TForm1.ServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
  Stream : TFileStream;
  Filename : String;
begin
  Filename := Format('%s%s',['htdocs',ARequestinfo.Document]);
  if not FileExists(sFilename) then Filename := 'htdocs/index.html';
  Stream := TFileStream.Create(sFilename, fmOpenRead or fmShareDenyWrite);
  // Hier muss man noch den ContentType abhängig vom Dateityp, setzen.
  AResponseinfo.ContentType := 'text/html';
  AResponseinfo.ContentStream := Stream;
  AResponseinfo.ContentLength := Stream.Size;
end;
Und damit haben wir dann auch in Delphi 'nen 14-Zeiler
Mehr ist für
Zitat von Phoenix:
Das Beispiel mit dem vollständigen Webserver (inkl. CSS, JS, Bildern, Videos, Binärformaten etc.)
nicht erforderlich.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.506 Beiträge
 
Delphi 12 Athens
 
#10

AW: WebServer

  Alt 27. Okt 2022, 12:30
Ja, ich gebe hier auch über einen TidHTTPServer eine Webseite raus,
genauer geht es um das HTML/CSS/JS/Image-Zeugs, was von Help&Manual generiert wurde.

Damit aber der Browser Bilder/JS/CSS ordentlich behandelt, mußte ich dann auch teilweise Dateien umkodieren (ANSI<>UTF-8), beim Rausgeben,
und zusätzlich auch an den HTTP-Headern rumspielen, also ContentType, Charset und Dergleichen alles selbst behandeln, entsprechend der angefragten DateiEndungen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz