Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Client Server Kommunikation & Protokoll (https://www.delphipraxis.net/90906-client-server-kommunikation-protokoll.html)

uht 25. Apr 2007 21:40


Client Server Kommunikation & Protokoll
 
Hallo,

meine Anwendung besteht aus einem Server und mehreren Clients, die Clients sollen bloß die Darstellung der Daten übernehmen. Der Server übernimmt alle Berechnungen. Damit die Kommunikation untereinander klappt habe ich mir folgendes Protokoll überlegt:
Der Client schickt eine Nachricht mit der Nummer der Funktion die aufgerufen werden soll an den Server, dieser meldet ein 'bereit' zurück und beginnt mit der Berechnung.
Wenn die Anwendung fertig ist, können das schon an die 100 verschiedene Funktionen werden die so aufgerufen werden sollen.

Delphi-Quellcode:
procedure TTCServer.IdTCPServerExecute(AContext: TIdContext);
  var
    msg: String;
  begin

    try
      msg:= AContext.Connection.IOHandler.Readln;
      log('Funktion ' + msg);    // Clientauftrag in Log schreiben
      case StrToInt(msg) of
        100: begin           // Versionsprüfung
               AContext.Connection.IOHandler.WriteLn('#100');   // #100 = bereit
               versionspruefung(AContext);
             end;
        150: begin           // Datei empfangen
               AContext.Connection.IOHandler.WriteLn('#100');   // #100 = bereit
               datei_empfangen(AContext);
             end;
        151: begin           // Datei senden
               AContext.Connection.IOHandler.WriteLn('#100');   // #100 = bereit
               datei_senden(AContext);
             end;
      else
        begin
          log('Anweisung ' + msg + ' existiert nicht');
          AContext.Connection.IOHandler.WriteLn('#200');   // #200 = Fehler-Funktion existiert nicht
        end;
      end;

    except
      log('Konnte Clientanweisung nicht lesen.');
    end;

  end;
Ist das eine sinnvolle Lösung, verpackt man sowas noch in Klassen oder gibt es dazu einen ganz anderen Ansatz?

Da ich nur Hobbyprogrammierer bin, fehlt mir noch die Theorie zu diesem Thema.

Jelly 25. Apr 2007 21:54

Re: Client Server Kommunikation & Protokoll
 
Wenn ich dich richtig verstanden haben willst du also vom Client aus lediglich eine Funktion mit Parameterübergabe aufrufen, und du willst als Ergebnis einen Parametersatz zurückerhalten. Wenn das wirklich alles ist, so empfiehlt sich vielleicht ein Webservice.

Sollen aber nach Anfrage vom Client auf dem Server irgendwelche Sachen zwischengespeichert werden zwecks späterer Berechnungen, so vergiss wieder ganz schnell den Webservice. Ansonsten aber denk ich damit recht leicht umzusetzen.

uht 26. Apr 2007 00:07

Re: Client Server Kommunikation & Protokoll
 
Zitat:

Zitat von Jelly
Sollen aber nach Anfrage vom Client auf dem Server irgendwelche Sachen zwischengespeichert werden zwecks späterer Berechnungen, ...

Genau das ist notwendig.


Wie wird das denn in größeren Anwendungen mit der Netzwerkkommunikation geregelt? Da gibt es doch bestimmt gewisse Konzepte an die man sich halten kann, oder?

Reinhard Kern 26. Apr 2007 10:53

Re: Client Server Kommunikation & Protokoll
 
Zitat:

Zitat von uht
Zitat:

Zitat von Jelly
Sollen aber nach Anfrage vom Client auf dem Server irgendwelche Sachen zwischengespeichert werden zwecks späterer Berechnungen, ...

Genau das ist notwendig.


Wie wird das denn in größeren Anwendungen mit der Netzwerkkommunikation geregelt? Da gibt es doch bestimmt gewisse Konzepte an die man sich halten kann, oder?

Hallo,

dazu eine Empfehlung von mir: ich habe früher auch Daten in Binärrecords verpackt und über Netze verschickt, bei Fehlern bin ich dann vor dem Protokoll-Analysator gesessen und habe die Bytes im Kopf wieder rückübersetzt in Zahlenwerte. Da kriegt man zwar Übung und weiss irgendwann, dass $F4 $01 als 16bit-Zahl 500 ist (oder man kann ASCII-Lochstreifen lesen wie Text), aber die Fehlersuche ist doch viel bequemer, wenn alles als normal lesbarer Text vorliegt. Der Trend geht auch allgemein in diese Richtung, sowohl Protokolle (http) als auch Dateien (XML) basieren heute meistens auf lesbarem Text.

Ich würde daher auf keinen Fall mehr so etwas wie ein Objekt oder einen Record in Binärform versenden. Als einziges, was man nicht auch mit Notepad erledigen kann, füge ich am Ende einer Zeile mit Daten (CSV) einen Doppelpunkt an gefolgt von einer vierstelligen Prüfsumme, damit die Übertragung abgesichert wird. Muss die Übertragung vertraulich sein, kann man ja eine Verschlüsselung einfügen, aber zu Testzwecken abschaltbar.

Natürlich wächst der Datenumfang auf mindestens das Doppelte. Aber in Zeiten von Gigabyte-Festplatten und Gigabit-Netzen ist das nicht wirklich ein Problem.

Ein solcher Senderecord sieht also so aus:

15,2007,04,26,11,55,22,100:FFFF (da bin ich jetzt zu faul, die Summe auszurechenen)

Maschine,Jahr,Monat,Tag,Stunde,Minute,Sekunde,Befe hl:Prüfsumme

Gruss Reinhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:52 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