Autor Beitrag
kalle345
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Di 01.05.12 09:54 
Ich möchte gern ein LAN-fähiges Mühlespiel programmieren, jedoch habe ich mit LAN in Delphi noch überhaupt keine Erfahrung und wäre deshalb über Hilfe erfreut.

Entschlossen habe ich mich bis jetzt für Indy TCP/IP, da die Übertragung nicht besonders schnell aber möglichst ohne Verlust sein soll. Oder könnt ihr mir etwas anderes empfehlen?

Folgendes dazu habe ich bereits in Erfahrung gebracht:
- Server führt nur wichtige („vertrauliche“) Berechnungen aus und vermittelt ansonsten nur die Clienten
- Clienten sind nur „Darsteller“
- Ich brauche auf der GUI einen TIdTCPClient und TIdTCPServer

Jedoch habe ich noch nichts über die Befehle zum Verbinden und zur Kommunikation gefunden.
Auch stellt sich mir die Frage wie die Datenpakete die übermittelt werden aufgebaut sind?! … sind das nur strings die man vor dem Versenden aufwendig zusammenstellen muss, und der Empfänger diese dann zerpflückt?

Gruß
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 01.05.12 10:03 
Hallo und :welcome: im Forum!

user profile iconkalle345 hat folgendes geschrieben Zum zitierten Posting springen:
Jedoch habe ich noch nichts über die Befehle zum Verbinden und zur Kommunikation gefunden.
So furchtbar viele Befehle haben die beiden Komponenten ja nicht. :D

user profile iconkalle345 hat folgendes geschrieben Zum zitierten Posting springen:
Auch stellt sich mir die Frage wie die Datenpakete die übermittelt werden aufgebaut sind?! … sind das nur strings die man vor dem Versenden aufwendig zusammenstellen muss, und der Empfänger diese dann zerpflückt?
Das ist eine Möglichkeit. Aktuellere Delphiversionen bieten da auch noch ganz andere Möglichkeiten an, aber ich vermute mal, dass du eine ältere hast, oder?

Jedenfalls findest du hier eine Serie von entsprechenden Anleitungen:
www.delphi-library.de/topic_66706.html

Bei den von dir genannten Komponenten kannst du schon bleiben, du musst das ganze nur ein wenig darauf anpassen. Aber die Ideen für das Übertragungsprotokoll usw. werden dort z.B. gut erklärt.
kalle345 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Di 01.05.12 10:42 
Zurzeit nutze ich Delphi 2005, hätte jedoch die Möglichkeit bei Bedarf Delphi 2010 oder sogar XE2 zu nutzen.
Ist ein Übermittel von beispielsweise Koordinaten mit den neueren Möglichkeiten denn einfacher?
Wie heißen denn Komponenten dazu?

Gruß
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 01.05.12 10:56 
Für den Anfang könntest du dir die Units DBXJSON und DBXJSONReflect anschauen. Damit kannst du ganze Objekte in einen String serialisieren und wieder daraus extrahieren:
docwiki.embarcadero....alizing_User_Objects
Diese Strings kannst du dann übermitteln.

Und ab der Enterprise Edition wäre DataSnap, das darauf aufbaut, eine sehr gute Kommunikationsmöglichkeit. Aber rein aus deiner Frage vermute ich, dass das für dich im Moment zu kompliziert und zu umfangreich ist.

Ich würde daher dazu raten die grundlegende Kommunikation über die TCP-Komponenten zu machen und dabei bei Bedarf die DBX-Units zu nutzen um Objekte zu übertragen. Auf diese Weise kannst du bei einem so einfachen Spiel wie Mühle recht komfortabel arbeiten, da ja nicht allzu viele Daten benötigt werden.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Di 01.05.12 19:31 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Für den Anfang könntest du dir die Units DBXJSON und DBXJSONReflect anschauen. Damit kannst du ganze Objekte in einen String serialisieren und wieder daraus extrahieren:
docwiki.embarcadero....alizing_User_Objects
Diese Strings kannst du dann übermitteln.
Ich hoffe, das war nur ein Beispiel dafür wie man das machen kann wenn man nur Strings hat. Ich mag JSON, aber bitte nichts serialisieren, was man nicht serialisieren muss.

user profile iconkalle345 hat folgendes geschrieben Zum zitierten Posting springen:

- Server führt nur wichtige („vertrauliche“) Berechnungen aus und vermittelt ansonsten nur die Clienten
- Clienten sind nur „Darsteller“
Das widerspricht sich.
  • Entweder die Clients sind nur Darsteller, dann berechnet der Server alles.
  • Oder die Clients rechnen selber, dann muss der Server immer auch mitrechnen um Konsistenzprüfung zu machen (Fehler/Cheater erkennen).
  • Oder der Server rechnet gar nicht; das passiert nur verteilt bei den Clients. Das ist schwieriger zu synchronisieren, aber erlaubt mehr Clients, weil der Server nicht überlastet werden kann (er tut ja nichts mehr)


Ich würde wirklich empfehlen, die Tutorials von user profile iconNarses aus dem Link oben mal von Anfang an durchzuarbeiten (Achtung: der Link geht auf den 5. Teil, aber die Liste steht ja ganz am Anfang dran). Ist die Beste Einfühung in das Thema, die ich kenne. Der Code funktioniert mit den Indies nicht 1:1, aber alle Konzepte (Server, Threads, Clients, Nachrichten, Protokolle etc) die dort vermittelt werden brauchst du ganz genau so wieder.

Client-Server-Sachen sind auch meiner Meinung nach die einzigen, bei denen es hilft sich vorher aufzumalen was auf welcher "Seite" der "Leitung" ist und wie das miteinander spricht. Kannst du ja bei den Tutorials schonmal machen, für dein eigenes Projekt wird das dann viel einfacher.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 01.05.12 19:42 
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Ich hoffe, das war nur ein Beispiel dafür wie man das machen kann wenn man nur Strings hat. Ich mag JSON, aber bitte nichts serialisieren, was man nicht serialisieren muss.
Warum soll man es sich nicht einfach machen? Klar kann man die Daten auch komplizierter einzeln nach einem bestimmten Schema schicken, aber warum sollte man?
Auf diese Weise werden übrigens in DataSnap die Daten von Objekten und ganzer Datasets hin- und hergeschickt. Ebenso die Parameter von Funktionsaufrufen, var-Parameter, Rückgabewerte, ... ;-)
Damit kann ich die Objekte und Funktionen in JavaScript-Clients genauso nutzen wie in Prism, RAD PHP, Delphi, ...

Aber wie schon geschrieben: Das wäre hier mit einer Atombombe auf einen Spatzen geschossen. ;-) Nichtsdestotrotz halte ich die Serialisierung hier zur Vereinfachung durchaus für sinnvoll.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mi 02.05.12 15:43 
Ich habe jetzt den ganzen Tag überlegt, wie ich das anders schreiben kann. Leider ist mir nichts eingefallen, also mit dem Hinweis "bitte nicht in den falschen Hals kriegen":
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Ich hoffe, das war nur ein Beispiel dafür wie man das machen kann wenn man nur Strings hat. Ich mag JSON, aber bitte nichts serialisieren, was man nicht serialisieren muss.
Warum soll man es sich nicht einfach machen? Klar kann man die Daten auch komplizierter einzeln nach einem bestimmten Schema schicken, aber warum sollte man?
Die Antwort passt zu dem Bild was ich von deiner Entwicklungsphilosophie habe. Warum sollte man nach KISS arbeiten, wenn es ein Tool mit wohlkingendem Markennamen dafür gibt?

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Auf diese Weise werden übrigens in DataSnap die Daten von Objekten und ganzer Datasets hin- und hergeschickt. Ebenso die Parameter von Funktionsaufrufen, var-Parameter, Rückgabewerte, ... ;-)
XMLRPC in JSON, ist ja soweit okay. Immerhin ist es nicht SOAP :) Im LAN ohne Angreifer ist das auch alles okay.
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Damit kann ich die Objekte und Funktionen in JavaScript-Clients genauso nutzen wie in Prism, RAD PHP, Delphi, ...
... was der OP gar nicht will.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Nichtsdestotrotz halte ich die Serialisierung hier zur Vereinfachung durchaus für sinnvoll.
Serialisierung ist dann sinnvoll, wenn ich Infrastruktur habe die nicht wissen kann, was sie da verschickt. Und selbst dann kann man immer noch binär serialisieren. Aber nicht, wenn man nur 4 Pakettypen braucht, von denen man vorher weiß an welche Plattformen sie gehen und wie sie sich verhalten müssen.
Und auch wenn Bandbreite heute nichts mehr kostet (diese verwöhnten Großstadtkinder ;-) ), das offensichtliche Argument ist ja die Sicherheit. Wer einen generischen Parser ans Netzwerk hängt und nach dem deserialisieren Objekte haben will mit denen dann gearbeitet wird, sollte schon sehr genau wissen was das bedeutet.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 02.05.12 15:59 
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Warum sollte man nach KISS arbeiten, wenn es ein Tool mit wohlkingendem Markennamen dafür gibt?
Also wenn du selbst zusammenbauen (oder allgemeiner gefasst: selbst machen) statt einem Funktionsaufruf für das Serialisieren (oder allgemeiner gefasst: statt vorhandene Technologien zu nutzen) für KISS hältst, dann habe ich wohl andere Vorstellungen von den S in KISS als du... ;-)
kalle345 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 06.05.12 15:34 
Ich habe mich nun für DataSnap entschieden, da es mir für den Anfang am einfachsten erscheint.
Um einen Überblick zu bekommen habe ich dieses Tutorial durchgearbeitet.
Soweit funktioniert alles gut wenn ich Server und Client auf dem gleichen Computer laufen habe.

Wenn ich jedoch Server und Client auf 2 Verschiedenen Computern im Netzwerk laufen habe kommt beim Client der folgende Fehler (auch wenn die Firewall aus ist):
fehler

Hoffe ihr könnt mir weiterhelfen?!

MfG

Moderiert von user profile iconNarses: Bild als Anhang hochgeladen.
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 06.05.12 15:41 
Standardmäßig ist bei der TSQLConnection der Host auf localhost eingestellt, wenn du auf dem Client diese auf Datasnap einstellst. Das geht dann logischerweise nur lokal. Hast du den korrekten Hostnamen / IP gesetzt?

SQLConnectionParams
Einloggen, um Attachments anzusehen!
kalle345 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 07.05.12 19:12 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Standardmäßig ist bei der TSQLConnection der Host auf localhost eingestellt, wenn du auf dem Client diese auf Datasnap einstellst. Das geht dann logischerweise nur lokal. Hast du den korrekten Hostnamen / IP gesetzt?


Ach natürlich … vielen Dank!
Melde mich bei Bedarf wieder... ;)

MfG
bernd2011
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 10.05.12 15:30 
unter SOURGE FORGE gibt es Demos zu INDY 10 client server , einfach mal den Code anschauen