Protokoll für komplexe Kommunikation

Alle Fragen zur Netzwerkkommunikation
Antworten
Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Protokoll für komplexe Kommunikation

Beitrag von Scotty »

Ich betreibe Datenaustausch per TCP/IP (Synapse). Verschickt wird zurzeit ein String, bei dem das erste Zeichen für die Art des Inhalts steht (mittlerweile 20 verschiedene Sachen), dann Sender und Empfänger kommen und zuletzt ein String mit dem Inhalt der Nachricht. Dieser String wird entweder einfach komplett genutzt (Chat), per pos/copy zerlegt oder auch als DelimitedText verarbeitet. Das funktioniert, scheint mir aber nicht flexibel genug. Jetzt überlege ich, ob alle Daten als XMLDocument ausgetauscht werden sollten. Ist das sinnvoll oder gibt es eine einfachere Lösung?

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Protokoll für komplexe Kommunikation

Beitrag von mschnell »

Natürlich gibt es Hunderte verschiedene Lösungen.

Ein offizieller Standard ist "SOAP", der XML verwendet. Im allgemeinen wird dann auch noch HTTP als Zwischenschicht eingebaut, was die Sache natürlich sehr universell macht, aber auch sehr viel Overhead erzeugt.

Wenn Du etwas Geld ausgeben willst, könntest Du den RemOBJ SDK verwenden (eigentlich für Delphi, ist aber vom Hersteller auch auf FPC getestet). Hier wird kann man beliebige Funktionen deklarieren, die jeweils von einem Kommunikationspartner aufgerufen werden und dann beim anderen ablaufen ("RPC" = "remote procedure call"). Das ist sehr praktisch verwendbar und der User merkt von der darunter liegenden Kommunikations-Implementierung nichts. Als Kommunikations-Implementierungen werden u.a SOAP auf HTTP und "proprietär und komprimiert" auf TCP/IP angeboten (aber auch Windows Messages und vieles andere mehr.

RPC kann man natürlich auch zu Fuß implementieren.

Gruß,
-Michael

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Protokoll für komplexe Kommunikation

Beitrag von Scotty »

Wenn ich mir die 1000 Methoden für XML ansehe, scheint mir schon das recht übertrieben. Am liebsten wäre mir eine Art Inifile:

Code: Alles auswählen

case Msg.ReadString('Kind','') of
  nwChat:ShowMessage(Msg.ReadString('Chat',' '));//'' -> You don't have permission to access /posting.php on this server.
  nwPlayerCount:NumberOfPlayer:=Msg.ReadInteger('NumberOfPlayers',0));
end;

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Protokoll für komplexe Kommunikation

Beitrag von theo »


Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2641
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Protokoll für komplexe Kommunikation

Beitrag von m.fuchs »

Ganz klar: JSON und REST.

JSON ist ein Datenformat mit dem auch komplexe Strukturen wie Arrays und Objekte serialisiert werden können, REST eine Architekturart für verteile Anwendungen. Mit HTTP als Unterbau ist das alles recht einfach. Dafür würde ich dann Synapse einsetzen.

Wenn du genaueres wissen willst, sag einfach Bescheid.

Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Protokoll für komplexe Kommunikation

Beitrag von Scotty »

JSON klingt gut und ist wahrscheinlich auch ähnlich theos Empfehlung. In den Quellen und Beispielen von fpjson gibt es ausreichend Hinweise, wie man schreibt und liest, aber was mir fehlt, ist eine Möglichkeit, das komplette Objekt zu verschicken.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2641
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Protokoll für komplexe Kommunikation

Beitrag von m.fuchs »

Scotty hat geschrieben:JSON klingt gut und ist wahrscheinlich auch ähnlich theos Empfehlung. In den Quellen und Beispielen von fpjson gibt es ausreichend Hinweise, wie man schreibt und liest, aber was mir fehlt, ist eine Möglichkeit, das komplette Objekt zu verschicken.

Verschicken machst dann mit Synapse. Einfach die Funktion AsJSON deines TJSONObject aufrufen und du bekommst einen String, der den JSON-Code enthält. Diesen String dann per HTTP-POST an den Server weiterreichen und fertig. Der nimmt den entgegen, dekodiert ihn und arbeitet mit den Daten. Das geht dann problemlos sogar über Sprach- / Systemgrenzen hinaus. Ich habe hier einige Clientprogramme in Lazarus geschrieben, die mit einer Serverapplikation bestehend aus PHP in einem Apache-Server kommunizieren.

mfg
Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Protokoll für komplexe Kommunikation

Beitrag von Scotty »

Wie Strings mit Synapse verschickt werden, ist klar. AsJson ist einfach und wie ich den String dann nach Json zurück konvertieren kann, würde ich vielleicht noch finden - vermutlich per AsString(). Aber was ist mit Unicode? Laut Quellcode ist TJSONStringType = AnsiString; definiert.

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Protokoll für komplexe Kommunikation

Beitrag von Hitman »

Scotty hat geschrieben:Aber was ist mit Unicode? Laut Quellcode ist TJSONStringType = AnsiString; definiert.

--> UTF8 ;-)

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Protokoll für komplexe Kommunikation

Beitrag von mschnell »

Scotty hat geschrieben: Laut Quellcode ist TJSONStringType = AnsiString; definiert.
Momentan unterscheiden FPC nicht zwischen AnsiString und UTF8.

-Michael

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Protokoll für komplexe Kommunikation

Beitrag von Scotty »

Jetzt frage ich doch besser erstmal hier: Wie bekomme ich aus dem verschickten String wieder ein TJSONObject?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2641
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Protokoll für komplexe Kommunikation

Beitrag von m.fuchs »

Scotty hat geschrieben:Jetzt frage ich doch besser erstmal hier: Wie bekomme ich aus dem verschickten String wieder ein TJSONObject?

Mit dem TJSONParser funktioniert das. Dessen Methode Parse gibt ein TJSONData-Objekt zurück was wieder in ein TJSONObject gewandelt werden kann.

Ein Beispiel wie ich das gemacht habe kannst du dir unter http://tohuwabohu.svn.sourceforge.net/viewvc/tohuwabohu/trunk/client/core/model.pas?view=markup ansehen.

mfg
Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten