![]() |
Client-Server-Datenübertragung
Ich würde gerne etwa 100-500 KB große Binärdaten innerhalb eines LAN von einem Server an einen Client übertragen.
Da ich so etwas noch nie gemacht habe und es in Delphi 2010 soviele Möglichkeiten gibt (Sockets über API, WinSockets, TTCPClient/Server, Indy, ...), würde ich Euch gerne fragen, was Ihr empfehlen würdet. Optimal wäre es, (1) wenn man Streams übertragen könnte (etwa aus serverseitigen TMemoryStream an einen clientseitigen TMemoryStream) oder anderweitig größere Datenmengen in einem Rutsch übertragen könnte; (2) der Programmieraufwand dabei übersichtlich und geradlinig wäre, also bequem zu benutzen. Welche Komponenten sind am vorteilhaftesten? Hat jemand ein Beispiel zur Hand? Vielen Dank im voraus! |
AW: Client-Server-Datenübertragung
|
AW: Client-Server-Datenübertragung
Die allereinfachste ist, eine gemeinsam erreichbare Freigabe einzurichten. Der Server speichert dort die Daten und der Client holt sie sich.
Methode 2 ist etwas aufwendiger; der Server schickt die Daten per Mail an den Client als Mailattachment. Dafür muss man in beide Programme die Mailfuktion einbauen, etwa mit Indy. Soll das ganze nur intern laufen, braucht man noch einen Mailserver, z.B. HMailer. Über eine TCP-Verbindung geht es auch; die Verbindung geht dann aber nur wenn beide aktiv sind, Server und Client. |
AW: Client-Server-Datenübertragung
@Neumann: Die Datenübertragung wird oft nötig und ich will gerade auf Schreiben/Lesen in Datenbank oder Filesystem verzichten. Es soll schon direkt per Intranet von Rechner an Rechner übertragen werden. Der Server wird immer laufen, die (vielen) Clients holen sich die Daten immer dann ab, wenn sie sie gerade benötigen.
|
AW: Client-Server-Datenübertragung
Zitat:
Wenn eine Datei zur Übertragung bereit ist, sendet der Server sie als Stream mit
Delphi-Quellcode:
und der Client liest den Stream mit
// write stream size and then stream data
AContext.Connection.IOHandler.Write(AStream, 0, True);
Delphi-Quellcode:
(wobei der Client ebenfalls in einer Endlosschleife prüft, ob Daten vom Server angekommen sind:
// reads the stream size then reads the stream data
Client.IOHandler.ReadStream(MyStream, -1, False);
Delphi-Quellcode:
while not Terminated do
begin IdTCPClient1.IOHandler.CheckForDataOnSource(50); if not IdTCPClient1.IOHandler.InputBufferIsEmpty then begin // Stream - Objekt erzeugen ... // Daten empfangen Client.IOHandler.ReadStream(MyStream, -1, False); // Daten verarbeiten und danach Stream freigeben ... end; end; |
AW: Client-Server-Datenübertragung
|
AW: Client-Server-Datenübertragung
@mjustin: Kann man sich die Endlosschleifen irgendwie ersparen und das ganze Event- oder Message-basiert ablaufen lassen?
Sowohl Client als auch Server haben auch genug anders zu tun. Meine Anwendung: Der Server rechnet komplexe Daten aus, die Clients rufen sie ab und stellen sie auf verschiedene Arten interaktiv dar. Hat Indy Vorteile gegenüber TTCPClient/Server? |
AW: Client-Server-Datenübertragung
Zitat:
Indy enthält eine HTTP Server Komponente (TIdHTTPServer), der Server liest auf Anforderung des Clients die Datei in einen Stream und überträgt sie an eine TIdHTTP Client Komponente). Welche Datei der Client erhält, entscheidet dabei nur der Server. |
AW: Client-Server-Datenübertragung
Zitat:
Wenn der Client aber die Kommunikation mit einem Request startet und der Server dann eine Response zurücksendet, braucht man diese Loop nicht. Ich hatte aufgrund der ersten Beschreibung ("von einem Server an einen Client übertragen") angenommen, dass der Server die Dateiübertragung startet, wenn eine Datei zu senden ist. Das wäre der Fall aus meinem Beispielcode. Für Request/Response ist HTTP mit Indy passend, der Client muss keine Schleife verwenden um den Socket zu überwachen, sondern nur IdHTTP.Get ausführen, das dann die Daten zurückliefert. Zitat:
Zitat:
![]() Zitat:
|
AW: Client-Server-Datenübertragung
Zitat:
Wenn ich das auf die Schnelle auf den Embarcadero-Seiten richtig verstanden habe, dann können sich Server und Client ganze selbstdefinierte Delphi-Objekte TMyClass() einschließlich aller Daten-Inhalte und Methoden teilen und der Client auf die Server-Daten einfach so zugreifen? Und das geht auch mit eigenen komplexen, abgeleiteten Objekten? Man muss sich dann gar nicht um Synchronisation und dergleichen kümmern? Das wäre genial! Es geht bei mir nämlich in der Tat um die Zuverfügungstellung großer Objekte, die ich sonst extra als komprimierte XML versucht hätte zu übertragen. Kann man dem Client auch ein Event-Signal geben, wann es wieder auf die Server-Daten zugreifen soll, z.B. wenn Veränderungen stattgefunden haben? Darf der Server an seinen Daten jederzeit etwas ändern, ohne dass man sich um die Synchronisation Gedanken machen muss? Kann man für die Dauer des "Neuaufbaus" oder der Rechnung die Daten blockieren oder geschieht das automatisch, wenn der Server halt in einer Routine drin streckt? Hm, klingt erst einmal gut, wäre viel Einarbeitung, aber vielleicht richtig lohnend. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:35 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