Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi *gelöst* Delphi Programm <-> Web Oberfläche //Kommunikation? (https://www.delphipraxis.net/134594-%2Ageloest%2A-delphi-programm-web-oberflaeche-kommunikation.html)

Darkface 25. Mai 2009 14:22


*gelöst* Delphi Programm <-> Web Oberfläche //Kommunik
 
Hiho,
Ich bin gerade am Überlegen für ein kleines Delphi Programm welches auf einem Windows Server läuft ein "Webinterface" zu schreiben. Webinterface ist eigentlich ein zu großer Begriff - eher ist es eine kleine Seite mit villeicht maximal 2-3 Buttons die man im Browser drückt und daraufhin das Delphi Programm die jeweilige Aufgabe erledigt. Das Delphi Programm und ein Apache Server laufen auf ein und dem selben System.
Mein Problem ist nun die Kommunikation zwischen der html/php Seite und dem Delphi Programm. Wie kann ich in PHP/Java Script oder einer ähnlichen Scriptsprache eine Information an mein Delphi Programm senden? Es ist auch nicht erforderlich eine Information vom Delphi Programm zurück an die Seite zusenden, da der Benutzer keine Rückmeldung benötigt.

Meine bisherigen Überlegungen gingen hin zu einer Textdatei die durch PHP auf Button druck mit jeweiligem Inhalt erstellt werden könnte. Das Delphi Programm könnte in einer Schleife nach einer solchen Datei im Verzeichnis suchen, falls gefunden bearbeiten und anshcließend löschen. Dieser Weg erscheint mir allerdings unsauber und ist wohl auch nicht für Zeitkritische Aufträge zu gebrauchen.

Gibt es einen anderen Weg die Informationen von der Webseite an das Delphi Programm auf selbem Host zu übergeben?

Danke schonmal
Grüße Dark

Real-TTX 25. Mai 2009 14:31

Re: Delphi Programm <-> Web Oberfläche // Kommunikatio
 
Ich würde an deiner Stelle ein TCP Server in das Delphiprogramm integrieren und dann per PHP-Skript darauf zugreifen. So habe ich, ein ähnliches Problem gelöst.

Gruß, Real-TTX

Darkface 25. Mai 2009 14:38

Re: Delphi Programm <-> Web Oberfläche // Kommunikatio
 
Das verstehe ich leider nicht so ganz, wie würde die Kommunikation dann aussehen?

Phoenix 25. Mai 2009 14:42

Re: Delphi Programm <-> Web Oberfläche // Kommunikatio
 
Warum machst Du die Oberfläche nicht mit IntraWeb?

Real-TTX 25. Mai 2009 18:03

Re: Delphi Programm <-> Web Oberfläche // Kommunikatio
 
Zitat:

Zitat von Darkface
Das verstehe ich leider nicht so ganz, wie würde die Kommunikation dann aussehen?

Naja Im Prinzip: PHP SCRIPT <--> TCP SERVER <--> DELPHI PROGRAMM

Der TCP Server ist deinem Fall ja Bestandteil von deinem Delphi Programm. Und über TCP kannst du ja bequem jegliche art von Daten austauschen.

Hier ein PHP Beispiel für den Zugriff auf dein TCP Server :
Code:
<?php
$port = 21000; // >1024
$fp = fsockopen("tcp://127.0.0.1", $port, $errno, $errstr); // Verbindung aufbauen
if (!$fp) {
    echo "ERROR: $errno - $errstr
\n"; // Falls ein Fehler aufgetreten ist
} else {
    fwrite($fp, "help\n"); // Hier der String der an dein Delphiprogramm gesendet werden soll (Vorzugsweise noch ein CR)
    echo fread($fp, 26); // Hier wird die Antwort ausgegeben
    fclose($fp);
}
?>
Oder was verstehst du daran nicht?

Zerolith 25. Mai 2009 18:46

Re: Delphi Programm <-> Web Oberfläche // Kommunikatio
 
- Intraweb fällt eigentlich doch weg, nachdem die "Weboberfläche" nur ein Addon ist

Ist die Kommunikation Webserver <> Anwendung notwendig? Ansonsten hätte ich halt gleich einen SocketServer (oder Indy Webserver) auf die Form geklatscht, am Port 80 gelauscht und die Requests entsprechend der aktion geprüft. Und halt per Default ein klein Wenig HTML zurückgegeben.

omata 25. Mai 2009 21:01

Re: Delphi Programm <-> Web Oberfläche // Kommunikatio
 
Oder man erweitert PHP mit einer in Delphi-geschriebenen-Extension. klick

sirius 25. Mai 2009 21:13

Re: Delphi Programm <-> Web Oberfläche // Kommunikatio
 
Wie wärs mit einem Automatisierungsobjekt in Delphi?
Das kannst du dann mit
Code:
new COM("Deine Klasse")
ganz bequem initialisieren und dann einfach die Methoden wie gewohnt aufrufen.

mjustin 25. Mai 2009 21:30

Re: Delphi Programm <-> Web Oberfläche // Kommunikatio
 
Zitat:

Zitat von Darkface
Gibt es einen anderen Weg die Informationen von der Webseite an das Delphi Programm auf selbem Host zu übergeben?

XMLHttpRequest

http://de.wikipedia.org/wiki/XMLHttpRequest

Wenn die Browser nicht allzu älteren Datums sind, können mit JavaScript (sofern aktiviert) XML Requests aus dem Browser an einen Server gesendet werden. Die Antwort des Servers kann dann 'asynchron' empfangen werden.

Server wäre in diesem Fall das Delphi Programm mit einem eingebauten IdHTTPServer auf einem eigenen Port (da der Apache Webserver vermutlich den Standardport 80 bereits belegt).

Vorteil der Lösung ist, dass XMLHttpRequest bereits in neueren Browsern unterstützt wird. Ein Nachteil ist, dass es keine standardisierte API gibt. Der Artikel der Wikipedia gehat darauf auch im Quelltextbeispiel ein.

Darkface 26. Mai 2009 14:36

Re: Delphi Programm <-> Web Oberfläche // Kommunikatio
 
Danke für die zahlreichen Antworten!
Das meiste läuft wie ich sehe bisher darauf hinaus eine Art Webserver durch das Delphi Programm bereitzustellen und durch verschiedene Protokolle Daten zu versenden.

Zitat:

Zitat von Phoenix
Warum machst Du die Oberfläche nicht mit IntraWeb?

Habe bisher noch nie damit gearbeitet und steige im ersten Schreck auch nicht ganz durch wie ich damit arbeiten kann - scheint mir aber auch "überdimensioniert" ( :duck: )...


Zitat:

Zitat von Real-TTX
Naja Im Prinzip: PHP SCRIPT <--> TCP SERVER &lt;--&gt; DELPHI PROGRAMM
[...]
Oder was verstehst du daran nicht?

Jetzt weis ich wie du es gemeint hast :roteyes: ! Scheint mir bisher die unkomplizierteste Lösung!


Zitat:

Zitat von Zerolith
Ist die Kommunikation Webserver <> Anwendung notwendig?

Ja :wink: ! Über den Webserver laufen noch viele andere Seiten...


Zitat:

Zitat von omata
Oder man erweitert PHP mit einer in Delphi-geschriebenen-Extension. klick

Das muss ich mir erst noch genauer ansehen.


Zitat:

Zitat von sirius
Wie wärs mit einem Automatisierungsobjekt in Delphi?

Noch nie davon gehört :oops:


Zitat:

Zitat von mjustin
XMLHttpRequest
[...]
Server wäre in diesem Fall das Delphi Programm mit einem eingebauten IdHTTPServer auf einem eigenen Port (da der Apache Webserver vermutlich den Standardport 80 bereits belegt).

Das ist auch eine Idee und du hast Recht, Apache belegt 80 und wird es auch immer tun :).


Nochmals danke für die vielen Anregungen werde mich mal beim einen oder anderen weiter Informieren!

Gruß

sirius 26. Mai 2009 14:58

Re: Delphi Programm <-> Web Oberfläche // Kommunikatio
 
Zitat:

Noch nie davon gehört
Dann erstelle mal eine ActiveX-Bibliothek (Datei--> neu -->...)
Speichere sie gleich als neues Projekt irgendwo ab (z.B. PTest).
Danach erstelle gleich ein Automatisierungsobjekt (vielleicht reicht auch ein COM-Objekt) (auch über Datei-->neu -->...)
Da kannst du dir einen Namen der Klasse aussuchen (z.B. TestButton)
Im Fenster der *.tlb gibst du dem Interface ITestButton eine neue Methode (z.B. Button1Click)
Dann drückst du auf Aktualisieren und gelangst in eine Unit. hier kannst du die angelegte Methode mit Leben füllen (z.B. ein LogFile schreiben).
Am Ende erzeugst du noch das Projekt und drückst anschließend in dem *.tlb-Fenster auf Registrieren.

Jetzt kannst du ja mal in deinem PHP Script folgendes probieren:
Code:
$obj = new COM("PTest.TestButton");
$obj->Button1Click;

Darkface 26. Mai 2009 22:10

Re: Delphi Programm <-> Web Oberfläche // Kommunikatio
 
Liste der Anhänge anzeigen (Anzahl: 2)
Also ich bin mal an der mir schlüssigsten Variante dran geblieben (Real-TTX -> TCP Server).

Ich habe also mein XAMPP geschnappt, den Quellcode von Real-TTX in eine index.php datei geworfen...

Zitat:

Zitat von Real-TTX
Hier ein PHP Beispiel für den Zugriff auf dein TCP Server :
Code:
&lt;?php
$port = 21000; // &gt;1024
$fp = fsockopen("tcp://127.0.0.1&quot;, $port, $errno, $errstr); // Verbindung aufbauen
if (!$fp) {
    echo &quot;ERROR: $errno - $errstr&lt;br /&gt;\n&quot;; // Falls ein Fehler aufgetreten ist
} else {
    fwrite($fp, &quot;help\n&quot;); // Hier der String der an dein Delphiprogramm gesendet werden soll (Vorzugsweise noch ein CR)
    echo fread($fp, 26); // Hier wird die Antwort ausgegeben
    fclose($fp);
}
?&gt;

Dann das Delphi Program -> TCP Server lauscht auf Port 21000.

Also habe ich das Programm gestartet und den Server Verbunden. Anschließend die php aufgerufen. Im Delphi Programm wurde auch das TcpServer1Accept Event ausgelöst. Jedoch kann ich den Text der gesendet wird nicht empfangen.

Das Programm und die php sind im Anhang. Bei Aufruf der php wird ledeglich die MessageBox('Empfang') angezeigt, die MessageBox die danach kommen sollte (mit dem Empfangenen Text) nicht. Als würde er unendlich lang Empfangen und nie etwas ausgeben :drunken:...

Könnte mir da jemand einen Wink geben was falsch sein könnte?

Für die die nicht downloaden wollen auchnochmal das TcpServer1Accept Event:

Delphi-Quellcode:
procedure TForm1.TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient);
var s:string;
begin
  ShowMessage('Empfang');
  s:=Clientsocket.Receiveln;
  ShowMessage(s);
end;
Danke & Gruß

Darkface 26. Mai 2009 22:33

Re: Delphi Programm <-> Web Oberfläche // Kommunikatio
 
Ok, Fehler gefunden:

Code:
<?php
$port = 21000;
$fp = fsockopen("tcp://127.0.0.1", $port, $errno, $errstr);
if (!$fp) {
    echo "ERROR: $errno - $errstr
\n";
} else {
    fwrite($fp, "hi");
    //echo fread($fp, 26); [b]<--- das darf nicht sein da er sonst wartet und wartet und den fclose befehl nicht ausführt[/b]
    fclose($fp);
}
?>
ABER: Die Nachricht wird zwar übertragen aber es kommt häufig zu Bugs, da sind Beispielsweise die Messageboxen überlang :(...

Darkface 26. Mai 2009 23:46

Re: Delphi Programm <-> Web Oberfläche // Kommunikatio
 
Liste der Anhänge anzeigen (Anzahl: 1)
So nach ausreichend langen Tests ist diese Art der Übertragung absolut Funktionstüchtig ich bin begeistert :dancer: :party: :firejump: !

Dieser Messagebox Bug war nach Neustart von Delphi & neu kompilieren weg ^^.

Außerdem habe ich meinen Browser veranlasst in einer Dauerschleife die Zahlen von 1 bis 50 in jeweils einer Zeile zu senden, habe diese dann vom Programm einlesen und auf Übertragungsfehler überprüft. Als mir mein Programm dann fröhlich meldete: "11743/11743 //Alle richtig" hab ichs dann auch geglaubt :D. Danke an Real-TTX für die TCP Server Idee die perfekt funktioniert!

Nochmal QuellText und im Anhang auch alle Dateien von der Funktionierenden Lösung:

PHP:
Code:
<?php
$port = 21000;
$fp = fsockopen("tcp://127.0.0.1", $port, $errno, $errstr);
if (!$fp) {
    echo "ERROR: $errno - $errstr
\n";
} else {
    fwrite($fp, "Text der Übertragen werden soll");
    fclose($fp);
}
?>
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  If Button1.Caption='Verbinden' Then //Falls nicht Verbunden
  begin
    TcpServer1.Active:=true;         //Verbinden
    Button1.Caption:='Trennen';      //Button entsprechend umbenennen :D
  end Else
  begin                              //Falls Verbunden
    TcpServer1.Active:=false;        //Trennen
    Button1.Caption:='Verbinden';    //Button entsprechend umbenennen :D
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  TcpServer1.Close;
end;

procedure TForm1.TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient);
var s:string;
begin
  s:=Clientsocket.Receiveln; //Zeile Empfangen...
  ShowMessage(s);            //..und zweimal...
  Memo1.Lines.Add(s);        //ausgeben
end;
Danke allen war ja am Ende ganz Simpel :) - Damit ist auch ein umfangreicheres Webinterface ohne Probleme sehr sehr einfach möglich!
Was haltet ihr von dieser Lösung? Gibt es villeicht noch Vorschläge zur Verbesserung?

Gruß

divBy0 7. Mai 2013 18:40

AW: *gelöst* Delphi Programm <-> Web Oberfläche //Kommunikation?
 
Der Beitrag ist zwar schon älter, aber vielleicht hat ja trotzdem jemand ein Beispiel, wie die TCP-Kommunikation von der Anwendung zur Weboberfläche abläuft.

Darkface 8. Mai 2013 07:37

AW: *gelöst* Delphi Programm <-> Web Oberfläche //Kommunikation?
 
Das Thema ist allerdings schon älter. Ich habe leider gerade keinen Zugriff auf mein altes Projekt.
Falls ich mich recht entsinne ist es aber darauf hinausgelaufen das das fSockOpen in PHP offen gehalten werden muss und lauscht während in Delphi über den TCP Socket eine Nachricht gesendet wird.

divBy0 8. Mai 2013 08:30

AW: *gelöst* Delphi Programm <-> Web Oberfläche //Kommunikation?
 
Ich habe es so gemacht, dass ich von PHP aus ein Kommando oder Daten senden und eine Antwort abwarte (fread()). Macht einen stabilen Eindruck bis jetzt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:17 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