AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Bitte um Hilfe für Webservice/Gateway/PortListener
Thema durchsuchen
Ansicht
Themen-Optionen

Bitte um Hilfe für Webservice/Gateway/PortListener

Ein Thema von Bali · begonnen am 20. Sep 2012 · letzter Beitrag vom 21. Sep 2012
Antwort Antwort
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#1

AW: Bitte um Hilfe für Webservice/Gateway/PortListener

  Alt 20. Sep 2012, 09:25
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:
//----------------------------------------------------------------------
// 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;
Hoffe das hilft als start!
Ralph

Geändert von Jumpy (20. Sep 2012 um 09:28 Uhr)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Bitte um Hilfe für Webservice/Gateway/PortListener

  Alt 20. Sep 2012, 09:43
Service erstellen, einfache Variante


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 http://stackoverflow.com/questions/1...service-design (die Antwort enthält den Code für ein Service-Grundgerüst) empfehlen statt ServerExecute, einen eigenen Thread zu starten. Im Falle eines einfachen Indy HTTP Servers wäre das dann dessen Threadpool.

Ich schlage vor einen Eintrag für einen Mini-HTTP Server Service in die Code Library zu stellen
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Bitte um Hilfe für Webservice/Gateway/PortListener

  Alt 20. Sep 2012, 09:55
[OT] Kleiner Hinweis:
Zitat:
if SA_WaitList <> nil then SA_WaitList.Free;
ist doppeltgemoppelt, da Free selbst auf nil prüft. Das ist auch der Grund, wieso man immer Free statt Destroy aufrufen soll. [/OT]
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
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#4

AW: Bitte um Hilfe für Webservice/Gateway/PortListener

  Alt 20. Sep 2012, 10:32
[OT] Kleiner Hinweis:
Zitat:
if SA_WaitList <> nil then SA_WaitList.Free;
ist doppeltgemoppelt, da Free selbst auf nil prüft. Das ist auch der Grund, wieso man immer Free statt Destroy aufrufen soll. [/OT]
Also egal, ob SA_WaitList
- nie erzeugt wurde (kann hier in dem Bsp. nicht sein, aber generell?) oder
- ob es schon vorher freigegeben wurde,
SA_WaitList.Free funktioniert?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Bitte um Hilfe für Webservice/Gateway/PortListener

  Alt 20. Sep 2012, 10:33
Wenn es freigegeben und auf nil gesetzt oder mit nil initialisiert und nie instanziert wurde, richtig.
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
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: Bitte um Hilfe für Webservice/Gateway/PortListener

  Alt 21. Sep 2012, 07:58
[OT] Kurzes Thread-Hijacking, da es hier aufkam:

Wenn es freigegeben und auf nil gesetzt oder mit nil initialisiert und nie instanziert wurde, richtig.
Nochmal nachgehakt. Wenn ich es nie instanziere und auch vorher nicht mit nil initialisiere, dann würde es kanllen?

Delphi-Quellcode:
var t:TStringlist;
begin
try
  Irgendwas, das eine Exception auslöst;
  t:=TStringlist.Create;
  Irgendwas anderees mit t;
finally
  t.Free;
end;
end;
Hier t nie erzeugt, da es schon vorher knallt, wird aber im finally freigegeben?

Delphi-Quellcode:
var t:TStringlist;
begin
t:=TStringlist.Create;
try
  Irgendwas, das eine Exception auslöst;
  Irgendwas anderees mit t;
finally
  t.Free;
end;
end;
Hier ist t vor der exception erzeugt worden und kann freigegeben werden?

[/OT]
Ralph

Geändert von Jumpy (21. Sep 2012 um 08:01 Uhr)
  Mit Zitat antworten Zitat
Bali

Registriert seit: 10. Feb 2009
23 Beiträge
 
Delphi 2005 Professional
 
#7

AW: Bitte um Hilfe für Webservice/Gateway/PortListener

  Alt 21. Sep 2012, 09:28
oh je oh je ....

habe gestern den ganzen Tag mit euren Posts getestet ... und habe es leider nicht geschafft ...

Werde jetzt dann den ZIP file von BUMMI testen und mich dann wieder melden.

Dankeschön für all euren Support !

Tobi
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Bitte um Hilfe für Webservice/Gateway/PortListener

  Alt 21. Sep 2012, 11:20
[OT] Kurzes Thread-Hijacking, da es hier aufkam:

Wenn es freigegeben und auf nil gesetzt oder mit nil initialisiert und nie instanziert wurde, richtig.
Nochmal nachgehakt. Wenn ich es nie instanziere und auch vorher nicht mit nil initialisiere, dann würde es kanllen?

Delphi-Quellcode:
var t:TStringlist;
begin
try
  Irgendwas, das eine Exception auslöst;
  t:=TStringlist.Create;
  Irgendwas anderees mit t;
finally
  t.Free;
end;
end;
Hier t nie erzeugt, da es schon vorher knallt, wird aber im finally freigegeben?

Delphi-Quellcode:
var t:TStringlist;
begin
t:=TStringlist.Create;
try
  Irgendwas, das eine Exception auslöst;
  Irgendwas anderees mit t;
finally
  t.Free;
end;
end;
Hier ist t vor der exception erzeugt worden und kann freigegeben werden?

[/OT]
Genau so ... denn lokale Variablen werden nicht automatisch initialisiert wie globale oder Klassen-Variablen

Allerdings, wenn man sich das so ansieht, scheinst du hier doch eine globale Variable definiert zu haben
Delphi-Quellcode:
var
  globalSL : TStrings;

procedure Foo;
var
  localSL : TStrings;
begin
  // lokale Variablen sollten initialisiert werden
  // localSL := nil;
  try
    ...
    // mögliche Exception
    ...
    globalSL := TStringList.Create;
    localSL := TStringList.Create;
    ...
  finally
    globalSL.Free;
    localSL.Free; // mögliche Exception!!!
  end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (21. Sep 2012 um 11:25 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#9

AW: Bitte um Hilfe für Webservice/Gateway/PortListener

  Alt 20. Sep 2012, 10:28
Service erstellen, einfache Variante
Bezog sich darauf, die entsprechenden VCL-Dinge zun nutzen. Es gibt z.B. ja auch aufwendigere Varianten, wo man alles selbst macht, wie z.B. in dem Tutorial vom Delphi-Treff.

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.
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:21 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