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
Seite 1 von 2  1 2      
Bali

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

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

  Alt 20. Sep 2012, 07:40
OK, nennen wir das Zwischenprogramm C.

C liegt auf einem Windows 2008 Server.

Damit C die aufbereiteten Daten nach B schicken kann, ist kein Problem für mich.

Wichtig wäre für mich erstmal, wie A die Informationen nach C schicken kann.

A kann die Informationen über einen http oder xml String senden.

Aber wenn ich das richtig verstehe, muss auf C ein HTTP Server laufen, damit sich A und C verständigen können, richtig ?
Könnte ich nicht ein Programm schreiben, was wie ein Service läuft und ständig einen Port überwacht, und sobald der Port angesprochen wird, bzw. eine Info geschickt wird, nimmt das Programm die Info entgegen und bearbeitet sie.

Sorry, ist für mich in dem Thema alles ziemlich Neuland
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

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

  Alt 20. Sep 2012, 07:49
Muss IMHO kein HTTP-Server sein. Wie Du beschreibst, ein Dienst der auf einem Port (SS) lauscht, die Daten von 1 transformiert und an 2 weiterreicht (CS), das was von 2 zurückkommt gegf. wieder transformiert und an 1 zurückgibt.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Bali

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

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

  Alt 20. Sep 2012, 07:55
Richtig, an sowas denke ich, ich würde halt nur gern wissen, wie ich das umsetzen kann
  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, 07:55
A kann die Informationen über einen http oder xml String senden.
Ist A denn ein Programm, das du verändern kannst, oder ist a eine "fremde" Software, die du nur konfigurieren kannst, sprich du kannst da z.B. eine IP-Adresse angeben, wohin es die Daten schickt, o.ä.?

Wir haben z.B. hier eine Telefonanlage, die zu Login-Zwecken jedes Ereignis z.B. in eine Logdatei schreibt, man kann es aber stattdessen auch (über HTTP.Get) an einen HTTP-Server schicken lassen. Das haben wir ausgenutzt, um ein Programm C zu schreiben, an das die Daten geschickt werden. Das Leitet diese dann direkt und unverfälscht als HTTP-Client, ebenfalls via Get an eine Drittsoftware zur Gebührenerfassung weiter, speichert die Daten aber in aufbereiteter Form zusätzlich für uns ab. Wir haben C also dazwischengeschaltet.
Ralph
  Mit Zitat antworten Zitat
Bali

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

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

  Alt 20. Sep 2012, 08:08
A ist eine externe Software und ich kann dort nur sagen, wohin sie den String schicken sollen, also IP und Port Angabe.

Hört sich nach dem an, was ich auch gebrauchen könnte, aber ich möchte ungern jetzt auf dem System wo C läuft einen HTTP Server einrichten.
  Mit Zitat antworten Zitat
mjustin

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

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

  Alt 20. Sep 2012, 08:14
OK, nennen wir das Zwischenprogramm C.

C liegt auf einem Windows 2008 Server.

Damit C die aufbereiteten Daten nach B schicken kann, ist kein Problem für mich.

Wichtig wäre für mich erstmal, wie A die Informationen nach C schicken kann.

A kann die Informationen über einen http oder xml String senden.
HTTP ist also als Protokoll vorgesehen? Das ist ja wie bestellt Und XML als "Dateiformat" ist für Delphi auch kein Problem, also ok.

Aber wenn ich das richtig verstehe, muss auf C ein HTTP Server laufen, damit sich A und C verständigen können, richtig ?
Könnte ich nicht ein Programm schreiben, was wie ein Service läuft und ständig einen Port überwacht, und sobald der Port angesprochen wird, bzw. eine Info geschickt wird, nimmt das Programm die Info entgegen und bearbeitet sie.
Ja, so ein Programm heisst auch HTTP Server

Man kann es als Dienst laufen lassen, und es muss so eingestellt sein dass es auf dem Port lauscht der in A hinterlegt ist.

Wenn dann A eine HTTP Nachricht an diesen Port sendet, empfängt der Dienst den XML String. Im Dienst kann dann die Kommunikation mit B folgen.

Hört sich nach dem an, was ich auch gebrauchen könnte, aber ich möchte ungern jetzt auf dem System wo C läuft einen HTTP Server einrichten.
Wenn HTTP vom System A untersützt wird, ist das wohl die beste Möglichkeit. Man muss keinen IIS oder Apache HTTP Server installieren, es ist alles in einem kleinen Delphi Serviceprogramm machbar. Gefühlt mit weniger als hundert Zeilen Quellcode für einen einfachen Server.
Michael Justin
habarisoft.com

Geändert von mjustin (20. Sep 2012 um 08:31 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 20. Sep 2012, 08:28
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.752 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 20. Sep 2012, 08:57
Kuck mal hier. Vielleicht hilft das schon mal weiter.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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, 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
 
#10

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
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 09:31 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