Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi: SOAP zwischen 2 Rechnern (https://www.delphipraxis.net/190962-delphi-soap-zwischen-2-rechnern.html)

derseitzer 24. Nov 2016 07:51

Delphi: SOAP zwischen 2 Rechnern
 
Guten Tag,
Ich habe einen SOAP-Service ganz nach dieser Anleitung programmiert: http://chapmanworld.com/2015/03/30/c...ces-in-delphi/
Es klappt alles wie beschrieben.
Nun möchte ich aber das, was ich als Request auf der linken Seite eingebe, auf einem zweiten PC abrufen.
Hat jemand eine Idee oder schonmal was damit gemacht?
Gedanke: ich packe irgendwie nur den "Information holen"-Teil in einen neuen Button, spiele das Programm auf beide Rechner, drücke bei einem "ECHO" und beim anderen auf
den neuen "Information holen"-Button und die Information ist auf dem zweiten Rechner.
Problem: Es wird alles mit "Echo"-Funktionen beschrieben und ich will ja eigentlich kein Echo sondern ich will die Information auf den anderen Recner bekommen.

Vielen Dank für jegliche Hilfe

Rollo62 24. Nov 2016 09:01

AW: Delphi: SOAP zwischen 2 Rechnern
 
Ich verstehe nicht genau was du meinst:

Du hast Client.exe und Server.exe.

Ein Rechner ist Server, da läuft Server.exe.
Ein oder mehrere Rechner sind Clients, mit Client.exe.
Der Client muss natürlich die IP-Adresse zum Server angeben damit das läuft.

Ein oder mehrere Clients können mit dem einen Server kommunizieren, oder willst du mit 2 Servern kommunizieren ?
Wenn ja, warum ?

Rollo

derseitzer 24. Nov 2016 09:12

AW: Delphi: SOAP zwischen 2 Rechnern
 
Rollo erstmal danke für deine Hilfe:)
Wenn ich zwischen zwei Rechnern eine Kommunikation aufbauen will, kann ich doch auf einem der Rechner gleichzeitig den Server laufen lassen richtig?
Muss ich dann meine Ip-Adressen auf meinen Rechnern ändern? im Delphi Programm wird sie ja nirgends erwähnt.

ChrisE 24. Nov 2016 09:26

AW: Delphi: SOAP zwischen 2 Rechnern
 
Hallo,

wenn du die Beispielsourcen zu der Anleitung runter lädst, findest du in der Unit "unitIMyService.pas" die Methode GetIMyService. Darin siehst du, dass bei der Adresse immer auf "Localhost" mit Port 8080 zugegriffen wird.

Diesen Teil solltest du anpassen. Eine Möglichkeit ist es z.B. die "GetIMyService" per overload die Parameter "IPAdress: string; Port: Word" mit zu geben. Dadurch kannst du dich dann auf jeden PC mit diesem Service verbinden.

Gruß, Chris

derseitzer 24. Nov 2016 09:59

AW: Delphi: SOAP zwischen 2 Rechnern
 
das hier wäre ja die Funktion:
function GetIMyService(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): IMyService;
heißt ich müsst (system.false;192.168.x.y; nil) übergeben oder?:/

Und wenn das funktionieren würde, den server und client auf einem rechner laufen zu lassen und mich mit einem zweiten Rechner mit der oben genannten Funktion zu verbinden, dann hab ich ja trotzdem noch keine Möglichkeit einzusehen, was Rechner 1 geschickt hat oder doch?
Tut mir leid, dass ich mich mit dem ganzen einfach 0 auskenne...

ChrisE 24. Nov 2016 10:48

AW: Delphi: SOAP zwischen 2 Rechnern
 
Zitat:

Zitat von derseitzer (Beitrag 1354576)
das hier wäre ja die Funktion:
function GetIMyService(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): IMyService;
heißt ich müsst (system.false;192.168.x.y; nil) übergeben oder?:/

Ja, dass stimmt fast. Du kannst die Funktion verwenden wie sie ist, dann musst ud aber bei Addr -> "http://192.168.x.y:8080/wsdl/IMyService" übergeben (Vorausgesetzt: Du willst wsdl & der Port ist 8080.

Ich dachte mehr an sowas:
Delphi-Quellcode:
const
  defWSDL = 'http://%s:%d/wsdl/IMyService';
  defURL = 'http://%s:%d/soap/IMyService';
  defSvc = 'IMyServiceservice';
  defPrt = 'IMyServicePort';

function GetFullAdress(UseWSDL: Boolean; IPAdress: string; Port: Word): string;
begin
  if UseWSDL then result := defWSDL
             else result := defURL;
  result := Format(result, [IPAdress, Port]);
end;

function GetIMyService(UseWSDL: Boolean; IPAdress: string; Port: Word; HTTPRIO: THTTPRIO): IMyService;
begin
  result := GetIMyService(UseWSDL, GetFullAdress(UseWSDL, IPAdress, Port), HTTPRIO);
end;

function GetIMyService(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): IMyService;
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    Addr := GetFullAdress(UseWSDL, 'localhost', 8080);
    //if UseWSDL then
    //  Addr := defWSDL
    //else
    //  Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as IMyService);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;
Zitat:

Zitat von derseitzer (Beitrag 1354576)
Und wenn das funktionieren würde, den server und client auf einem rechner laufen zu lassen und mich mit einem zweiten Rechner mit der oben genannten Funktion zu verbinden, dann hab ich ja trotzdem noch keine Möglichkeit einzusehen, was Rechner 1 geschickt hat oder doch?

Das hängt vom Server ab. Du könntest entsprechende Funktionen etc. ja dort implementieren für die Clients.
Aber evtl. solltest du dein Problem nochmals etwas genauer beschreiben - also was möchtest du wirklich umsetzen?

Gruß, Chris

derseitzer 24. Nov 2016 11:12

AW: Delphi: SOAP zwischen 2 Rechnern
 
Mit diesem Code hier vom Client versuche ich mich ja zum Server zu connecten:
procedure TForm2.Button1Click(Sender: TObject);
var
Service: IMyService;
ReqEmployee: TMyEmployee;
ResEmployee: TMyEmployee;
begin
// capture interface to service
Service := unitIMyService.GetIMyService(system.False,'http://192.168.0.1:8080/wsdl/IMyService',nil); // hier die ip vom rechner mit server eingetragen
// build the request
ReqEmployee := TMyEmployee.Create;
try
ReqEmployee.FirstName := edtReqFirstName.Text;
ReqEmployee.LastName := edtReqLastName.Text;
ReqEmployee.Salary := Trunc(spedReqSalary.Value);
// Make the service request
ResEmployee := Service.echoMyEmployee(ReqEmployee);
try
// Display the response
edtResFirstName.Text := ResEmployee.FirstName;
edtResLastName.Text := ResEmployee.LastName;
spedResSalary.Value := Trunc(ResEmployee.Salary);
finally
ResEmployee.Free;
end;
finally
ReqEmployee.Free;
end;
end;


Nun kommt eine andere Fehlermeldung:
Dokumentelement
http//: schemas.xmlsoap.org/soap/envelope/Envelope erwartet, http//:schemas.xmlsoap.org/wsdl/:definitions gefunden
:shock: also ich bin schonmal froh das sich die fehlermeldung geändert hat. :D

ChrisE 24. Nov 2016 11:17

AW: Delphi: SOAP zwischen 2 Rechnern
 
Zitat:

Zitat von derseitzer (Beitrag 1354596)
Delphi-Quellcode:
Service := unitIMyService.GetIMyService(system.False,'http://192.168.0.1:8080/wsdl/IMyService',nil);    // hier die ip vom rechner mit server eingetragen
...
http//: schemas.xmlsoap.org/soap/envelope/Envelope erwartet, http//:schemas.xmlsoap.org/wsdl/:definitions gefunden

Du übergibst eine WSDL-Adresse und forderst im ersten Parameter der METHODE SOAP. Das sagt die Fehlermeldung. Entscheide Dich ;-)

Gruß, Chris

derseitzer 24. Nov 2016 11:30

AW: Delphi: SOAP zwischen 2 Rechnern
 
Also erstmal 1000Dank Chris :-D , gibt es einen Unterschied welches ich verwenden soll oder sind das einfach nur 2 verschiedene Pfadmöglichkeiten :?
also funktionieren tut es jetzt.. super:) dann werde ich jetzt probieren eine Funktion zu schreiben mit der ich vom einen auf den anderen PC Client schreiben kann
werde mich sicherlich nochmal melden, weil des werde ich sicherlich au nicht sofort hinbekommen :lol: aber danke erstmal :-D

derseitzer 24. Nov 2016 11:49

AW: Delphi: SOAP zwischen 2 Rechnern
 
Ok wenn ich nun einen zweiten Rechner habe von dem ich die Information vom 1. Rechner bekommen möchte, muss ich ja nun eine neue Funktion schreiben.
und zwar in Rechner 1 und 2 richtig? speichert mein Server die Information irgendwo ab, wenn ich ein Echo mache vom Rechner 1 aus?..ich glaube nicht..
heißt das nun ich sollte auf Rechner 2 einen Timer stellen der alle paar Millisekunden schaut ob eine Information angekommt? :?
Bestimmt nicht, der Server muss doch die Information die Rechner1 schickt irgendwo speichern

ChrisE 24. Nov 2016 12:57

AW: Delphi: SOAP zwischen 2 Rechnern
 
Hallo,

also ich würde jetzt erstmal wirklich nochmal genau dein Problem definieren - also Du sollst HIER dein problem beschreiben. Ohne Lösungen (SOAP/WSDL/Server erc.) sondern das Problem.

Es kann gut sein, das WSDL/SOAP dein problem einfach nicht löst.

Gruß, Chris

derseitzer 24. Nov 2016 13:12

AW: Delphi: SOAP zwischen 2 Rechnern
 
Ich würde gerne Daten von einem Rechner1 auf den anderen schicken, die beide im gleichen Netzwerk sind und das über SOAP, mehr nicht:)
Zuerst habe ich Server und Client auf Rechner1 gehabt und habe mit "ECHO" mir die Daten selber wieder geschickt.
Nun habe ich Server auf Rechner 2 und habe mir wieder Mit "ECHO" die Daten selber schicken können.
Nun möchte ich den Client auf Rechner 2 starten und mit Rechner 1 auf Rechner 2 Daten schicken. (oder Rechner 2 zu Rechner 1).
Und mein Problem ist, dass ich nicht weiß wie ich die Daten von Rechner 1 auf Rechner 2 bekommen soll. Ich weiß auch nicht, ob diese Daten dann dort irgendwo in der XML gespeichert sind.. ich hab nicht so viel Ahnung von dem Thema.

Grüße Robin

ChrisE 24. Nov 2016 13:37

AW: Delphi: SOAP zwischen 2 Rechnern
 
Hallo,

aber wäre dein Problem nicht dadurch beschrieben, dass du Daten von Rechner 1 zu Rechner 2 schicken willst (evtl. mit nem Server dazwischen)?
Warum SOAP? Hierfür kannst diu die Indy-Komponenten super verwenden. Und dir alles selber zusammen bauen.

Gruß, Chris

himitsu 24. Nov 2016 15:25

AW: Delphi: SOAP zwischen 2 Rechnern
 
Warum selber bauen, wenn es was Fertiges gibt?

Oder die neuen Tethering-Komponenten.



Posts nach dem Bearbeiten doppelt?
* Wirklich bearbeitet und nicht ausversehn zitiert, oder so?
* Oder nach dem Erstellen im Browser "zurück" und nochmal neu abgesendet?

derseitzer 25. Nov 2016 06:55

AW: Delphi: SOAP zwischen 2 Rechnern
 
hmm ok.. könnte mir jemand den Link zu diesem fertigen Programm schicken? Eigentlich wollte ich das ganze mit Soap machen, da es mir jemand geraten hat.. er meinte irgendwas von wegen fehlenden Zertifikaten, bitte fragt mich nicht. Aber in Ordnung bin für alles offen. Wenn ihr ein fertiges Programm habt werd ich dieses testen und wenn ihr eine weitere vorgehensweise für die soapverbindung habt werd ich diese auch testen:)

Edit: Hab die Verbindung nun anders gemacht, war extrem einfach. Aber es könnte sein, dass ich sie eben mit SOAP realisieren soll... mal schauen. Ich frag am Montag mal nach:)

Rollo62 25. Nov 2016 08:04

AW: Delphi: SOAP zwischen 2 Rechnern
 
http://docwiki.embarcadero.com/RADSt..._App-Tethering

http://docwiki.embarcadero.com/CodeE...otoWall_Sample

EDIT:
Ich würde aber damit erstmal versuchen einfache Strings auszutauschen, und keine allzu komplexen Objekte.
Das ganze würde ich erstmal so wie eine RS232-Kommunikation ansehen, bevor man das Letzte rauskitzelt.

Rollo

derseitzer 5. Dez 2016 07:30

AW: Delphi: SOAP zwischen 2 Rechnern
 
Tut mir schrecklich Leid, dass ich nun solange inaktiv hier war.. war leider auf Geschäftsreise :).
Also ich habe nun erneut nachgefragt, was denn nun mit Soap realisiert werden soll und zwar soll ich nicht irgendwas zwischen zwei Rechnern hin und her schicken, sondern ich habe eine wsdl Datei bekommen, in der viele viele Funktionen aufgelistet sind. Heißt leider kein TCP/IP-Indy-Komponente benutzbar, oder??

Lemmy 5. Dez 2016 07:36

AW: Delphi: SOAP zwischen 2 Rechnern
 
Zitat:

Zitat von derseitzer (Beitrag 1355332)
Tut mir schrecklich Leid, dass ich nun solange inaktiv hier war.. war leider auf Geschäftsreise :).
Also ich habe nun erneut nachgefragt, was denn nun mit Soap realisiert werden soll und zwar soll ich nicht irgendwas zwischen zwei Rechnern hin und her schicken, sondern ich habe eine wsdl Datei bekommen, in der viele viele Funktionen aufgelistet sind. Heißt leider kein TCP/IP-Indy-Komponente benutzbar, oder??

dann importiere die WSDL Datei mit Delphi (Komponente - WSDL importieren), dann hast Du einen Wrapper und kannst in Delphi einfach Klassen/Interfaces benutzen, d.h. nix TCP/IP, sondern Klassen/Interfaces instanziieren und nutzen


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz