![]() |
Bitte um Hilfe für Webservice/Gateway/PortListener
Hallo zusammen,
ich weis leider nicht den genauen Namen für das, was ich bauche, deswegen schrieb ich im Titel Webservice/Gateway und PortListener. Ihr müsst euch bitte vorstellen, es gibt ein System A und ein System B und diese beiden Systeme können nicht dirket miteinander sprechen. Deswegen brauch ich ein Zwischenprogramm (Webservice/Gateway/PortListener), das zwischen System A und System B steht. System A soll Informationen in einem String an das Zwischenprogramm schicken, dieses wiederum parst den String, bereitet ihn auf und schickt in passend an System B. System A schickt in unterschiedlichsten Zeiträumen solche Informationen. Ich hoffe es kommt einigermaßen verständlich rüber, von was ich rede und was ich brauche :) Für jede Hilfe oder Hinweis, womit ich mein Problem lösen kann, wäre ich sehr Dankbar. MfG Bali |
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
Es existiert aber ein System C auf das beide Zugrifff haben? Welches Os hat dieses?
|
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
Zitat:
(Oder haben sie schon irgendeine Möglichkeit, Daten zu senden (A) oder zu empfangen (B)?) Denn der WebService müsste ja A bekannt gemacht werden, damit A dahin senden kann, und B muss eine Eingangsschnittstelle haben, damit der Webservice B ansprechen kann. Auf welche Weise (Übertragungsprotokoll) sendet A seine Informationen zur Zeit? Angenommen, beide Systeme sind änderbar, kommen verschiedene Techniken in Frage. Hier ein Beispiel mit HTTP: Schritt 1: * Anwendung A kann über ein Protokoll wie HTTP Daten an C senden. Dazu benötigt A einen HTTP Client und C einen HTTP Server, der auf einem freien Port läuft. (Internet Direct (Indy) enthält einen einfachen HTTP Server) Schritt 2: * Anwendung C verarbeitet die erhaltenen Daten um sie für B passend zu machen. Schritt 3: * um die Daten von C an B zu übermitteln, gibt es zwei konträre Möglichkeiten, je nachdem, welcher Partner die Verbindung herstellen darf (d.h. wer Client und wer Server ist): - wenn die Anwendung B auch einen integrierten HTTP Server starten darf, dann kann C als HTTP Client mit B kommunizieren. (C sendet den HTTP Request an B) - falls die Anwendung B keinen integrierten HTTP Server enthalten darf (z.B. wegen Firewall), kann sie stattdessen als HTTP Client in regelmäßigen Abständen auf den Server C zugreifen und auf neue Nachrichten prüfen. Der Server auf C puffert die Nachrichten dazu bis sie von B abgerufen werden. Um Datenverlust zu vermeiden, kann C die Daten persistent machen (z.B. in einer kleinen lokalen Datenbank). |
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
Eine Art Proxy?
|
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
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 :( |
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
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.
|
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
Richtig, an sowas denke ich, ich würde halt nur gern wissen, wie ich das umsetzen kann :)
|
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
Zitat:
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. |
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
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. |
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
Zitat:
Zitat:
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. Zitat:
|
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 |
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
[OT] Kurzes Thread-Hijacking, da es hier aufkam:
Zitat:
Delphi-Quellcode:
Hier t nie erzeugt, da es schon vorher knallt, wird aber im finally freigegeben?
var t:TStringlist;
begin try Irgendwas, das eine Exception auslöst; t:=TStringlist.Create; Irgendwas anderees mit t; finally t.Free; end; end;
Delphi-Quellcode:
Hier ist t vor der exception erzeugt worden und kann freigegeben werden?
var t:TStringlist;
begin t:=TStringlist.Create; try Irgendwas, das eine Exception auslöst; Irgendwas anderees mit t; finally t.Free; end; end; [/OT] |
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
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 |
AW: Bitte um Hilfe für Webservice/Gateway/PortListener
Zitat:
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:53 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