![]() |
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
wow, super :)
dankeschön für die Erfolgsmeldungen :) Dann würde ich bitte nur noch gerne wissen, wie ich das in Delphi umsetzen kann. Tobi |
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
Kuck mal
![]() |
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
Zitat:
Basierend auf diesem Beitrag ![]()
Delphi-Quellcode:
Das Formular enthält nur eine TIdHTTPServer Komponente und ein Editfeld für die Eingabe des Ports, sowie eine Checkbox zum Starten / Stoppen.
unit MiniHTTPServer;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent, IdComponent, IdTCPServer, IdCustomHTTPServer, IdHTTPServer, StdCtrls, Contnrs; type TForm1 = class(TForm) Server: TIdHTTPServer; Active: TCheckBox; Port: TEdit; procedure ServerCommandGet(AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); procedure ActiveClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.ServerCommandGet(AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); begin // hier wird die Anfrage bearbeitet. // Die URL der Anfrage steht in ARequestInfo.URI, // und kann Parameter enthalten. // Beispiel "/index.html?data1=wert1&data2=wert2 // Die Parameter können einzeln ausgelesen werden, Beispiel // var1 := ARequestInfo.Params.Values['data1']; // Nach der Verarbeitung kann man einen Text zurücksenden (optional) AResponseInfo.ContentText:= 'hello world!'; end; procedure TForm1.ActiveClick(Sender: TObject); begin Try If Active.Checked then begin Server.DefaultPort:=StrToIntDef(Port.Text,80); end; Server.Active:=Active.Checked; Finally Active.Checked:=Server.Active; end; end; end. |
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
Service erstellen, einfache Variante:
Datei->Neu->Service-Anwendung Die Ide erstellt den Rumpf des Programms. Der TService hat eine Art Form, ist keine richtige Form, aber darauf kann man Komponenten klatschen, z.B. die HttpServer-Komponente von den Indys: IdHttoServer. Dann ein paar Events des Services einrichten, z.B.:
Delphi-Quellcode:
Hoffe das hilft als start!
//----------------------------------------------------------------------
// Service-Events //---------------------------------------------------------------------- //Damit der Service in der Liste der Dienste //auch eine vernünftige Beschreibung bekommt: procedure TPortaleSperrenServer.ServiceAfterInstall(Sender: TService); var Reg: TRegistry; begin Reg := TRegistry.Create(KEY_READ or KEY_WRITE); try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey('\SYSTEM\CurrentControlSet\Services\' + Name, false) then begin Reg.WriteString('Description', ServiceDescription); //ServiceDescription ist eine String-Konstante mit der Beschr. Reg.CloseKey; end; finally Reg.Free; end; end; procedure TPortaleSperrenServer.ServiceStart(Sender: TService; var Started: Boolean); begin CoInitialize(nil); //Brauch ich wg. Datenbankzugriffen, kann ggf. weg //Kann man im Prinzip alles reinmachen, was man sonst vllt. //bei Form Create reinmachen würde end; procedure TPortaleSperrenServer.ServiceExecute(Sender: TService); begin //Hier auch: //Kann man im Prinzip alles reinmachen, was man sonst vllt. //bei Form Create reinmachen würde Server.Port:=5555; SA_Waitlist:=TStringlist.Create; Server.Open; //Nun die Schleife, in der der Eigentliche Service Thread läuft try while not Terminated do begin ServiceThread.ProcessRequests(true); //false //Sleep(10); end; except on E:Exception do begin LogEvent('Server als Dienst','Letzte Nachricht','',e.Message); end; end; end; procedure TPortaleSperrenServer.ServicePause(Sender: TService; var Paused: Boolean); begin ServerSocket.Close; end; procedure TPortaleSperrenServer.ServiceContinue(Sender: TService; var Continued: Boolean); begin Server.Open; end; procedure TPortaleSperrenServer.ServiceStop(Sender: TService; var Stopped: Boolean); begin Server.Close; if SA_WaitList <> nil then SA_WaitList.Free; CoUnInitialize; end; procedure TPortaleSperrenServer.ServiceShutdown(Sender: TService); begin Server.Close; if SA_WaitList <> nil then SA_WaitList.Free; CoUnInitialize; end; //---------------------------------------------------------------------- // HTTPServer-Events //---------------------------------------------------------------------- //Einkommende Sendungen vom Programm A: procedure TMain.HTTPServerCommandGet(AThread: TIdPeerThread; RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo); begin //Die direkte weiterleitung der Daten if HTTPRedirect then Redirect(RequestInfo.UnparsedParams); //Wenn A eine Antwort braucht, das alles angekommen ist: if HTTPResponse then begin ResponseInfo.ResponseNo:=200; ResponseInfo.ResponseText:='OK'; ResponseInfo.WriteContent; end; //(HTTPRedirect,HTTPResponse = Boolche Konstante): //Zur weiterbearbeitung der Daten: EvalCallInfo(RequestInfo.Params.Values['event'], RequestInfo.Params.Values['date'], RequestInfo.Params.Values['src_if'], RequestInfo.Params.Values['src_cgpn'], RequestInfo.Params.Values['src_cdpn']) end; //Die Funktion, um die Daten direkt weiterzusenden. //Damit könnte man natürlich auch veränderte Daten senden. //Benutzt wird ein IdHTTP-Client, der immer neu erzeugt wird, //keine Ahnung, warum das nicht mit einer globalen Kompo gemacht wird procedure TMain.Redirect(const Params: String); var url:String; HTTP: TIdHTTP; begin url:='http://'+RedirectIP+':'+RedirectHost+'/?'+Params; HTTP:=TIdHTTP.Create(self); try HTTP.Get(url); finally HTTP.Free; end; end; |
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
Zitat:
Im Falle eines Indy Servers im Service kann man in ServiceStart Server.Active auf True setzen und bei Stop auf False. Das ServiceExecute kann dann eigentlich wegfallen. Quellen wie zum Beispiel ![]() Ich schlage vor einen Eintrag für einen Mini-HTTP Server Service in die Code Library zu stellen :idea: |
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
[OT] Kleiner Hinweis:
Zitat:
|
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
Zitat:
![]() Muss auch gestehen, dass in obigem Code, 2 Programme gemixt sind. Der Service nutzt eigentlich nur eine ServerSocket-Komponente. Das mit dem HTTP-Server ist aus einem anderen Programm. Darum ist das da glaub ich ins Execute gepackt worden. Oder läuft eine ServerSocket auch in einem eigenen Threadpool? Die Empfehlung da generell einen eigenen Thread zu nehmen und beim Service-Start zu starten, hab ich auch von anderen hier (Bummi?) schon öfter gelesen, aber ich hab immer noch Respekt vor eigenen Threads, Kollisionen usw. Einfach zu wenig Gelegenheit das bisher mal einsetzen zu müssen, deswegen die "einfache" Variante, wo einem alles vorbereitet wird. |
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
Zitat:
- nie erzeugt wurde (kann hier in dem Bsp. nicht sein, aber generell?) oder - ob es schon vorher freigegeben wurde, SA_WaitList.Free funktioniert? |
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
Wenn es freigegeben und auf nil gesetzt oder mit nil initialisiert und nie instanziert wurde, richtig.
|
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
Liste der Anhänge anzeigen (Anzahl: 2)
Weil ich mich eine Weile nicht mehr damit beschäftigt hatte ...
Im Anhang eine von TClientSocketThread abgeleitete Klasse und ein kleines Beispiel. Proxyfuntionalität, Eingriffsmöglichkeit in Request/ResposeStream |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:07 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