AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Client-Server-Datenübertragung
Thema durchsuchen
Ansicht
Themen-Optionen

Client-Server-Datenübertragung

Ein Thema von HJay · begonnen am 3. Dez 2012 · letzter Beitrag vom 21. Dez 2012
Antwort Antwort
Seite 1 von 3  1 23      
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#1

Client-Server-Datenübertragung

  Alt 3. Dez 2012, 17:19
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!
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Client-Server-Datenübertragung

  Alt 3. Dez 2012, 17:24
.. wenn Du Indy verwenden willst.

Stahli hat dazu ein Tutorial verfasst.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Neumann

Registriert seit: 6. Feb 2006
Ort: Moers
536 Beiträge
 
Delphi 12 Athens
 
#3

AW: Client-Server-Datenübertragung

  Alt 3. Dez 2012, 17:33
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.
Ralf
Gruß vom Niederrhein
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#4

AW: Client-Server-Datenübertragung

  Alt 3. Dez 2012, 17:39
@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.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Client-Server-Datenübertragung

  Alt 3. Dez 2012, 17:40
Ich würde gerne etwa 100-500 KB große Binärdaten innerhalb eines LAN von einem Server an einen Client übertragen.
Mit Indy (TIdTCPServer) ist das einfach zu realisieren. Der Server wartet auf eine Clientverbindung, und sobald sie hergestellt ist, führt er in einer Schleife den "OnExecute" Eventhandler aus.

Wenn eine Datei zur Übertragung bereit ist, sendet der Server sie als Stream mit

Delphi-Quellcode:
// write stream size and then stream data
AContext.Connection.IOHandler.Write(AStream, 0, True);
und der Client liest den Stream mit

Delphi-Quellcode:
// reads the stream size then reads the stream data
Client.IOHandler.ReadStream(MyStream, -1, False);
(wobei der Client ebenfalls in einer Endlosschleife prüft, ob Daten vom Server angekommen sind:


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;
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Client-Server-Datenübertragung

  Alt 3. Dez 2012, 17:42
Du kannst dir auch DataSnap ansehn.
Dürfte in D2010 Ent. schon drinnen sein.

Hier im Forum suchenDataSnap Bei Google suchenDataSnap



INDY ist aber leichtgewichtiger und, wenn es nur um Streams geht, vollkommen ausreichend.
$2B or not $2B
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#7

AW: Client-Server-Datenübertragung

  Alt 3. Dez 2012, 17:45
@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?
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Client-Server-Datenübertragung

  Alt 3. Dez 2012, 17:49
@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.
In diesem Fall (Client verbindet sich mit Server und fordert Datei an) ist HTTP mit Indy eine einfache Option:

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.
Michael Justin
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#9

AW: Client-Server-Datenübertragung

  Alt 3. Dez 2012, 18:20
@mjustin: Kann man sich die Endlosschleifen irgendwie ersparen und das ganze Event- oder Message-basiert ablaufen lassen?
TCP ist streamorientiert, man erfährt nur dann von der Existenz neuer Daten, wenn man eine Leseoperation auf dem Socket ausführt. Die asynchrone TClientSocket Komponente ist zwar "eventorientiert" in der Anwendung, aber intern nutzt sie die Windows Messageloop und prüft in ihr den Socket.

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.


Sowohl Client als auch Server haben auch genug anders zu tun.
Ein Thread, in dem der Socket in größeren Zeitabständen mittels z.B. CheckForDataOnSource(50) geprüft wird, belastet das System nicht spürbar.


Hat Indy Vorteile gegenüber TTCPClient/Server?
Remy Lebeau schrieb zu den TTcpServer/TTcpClient Komponenten:

Zitat:
They are also very poorly implemented, and not very useful, IMHO. They are
not VCL components to begin with, they are CLX components from the Kylix
days. Borland tried to write its own cross-platform socket components, but
narrowed everything down to a VERY bare-bones least-common-denominator
implementation between Windows and Linux that requires ALOT of manual work
in user code. As such, you are better off either re-installing the old VCL
sockets components, or switch to Indy's TIdTCPClient and TIdTCPServer
components (Indy has been bundled with Delphi since D6) or other third-party
library (like ICS or Synapse).
Michael Justin
habarisoft.com

Geändert von mjustin ( 3. Dez 2012 um 18:22 Uhr)
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#10

AW: Client-Server-Datenübertragung

  Alt 3. Dez 2012, 18:39
Du kannst dir auch DataSnap ansehn.
Dürfte in D2010 Ent. schon drinnen sein.
DataSnap kenne ich noch gar nicht, aber auf den ersten Blick klingt das richtig genial.

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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:19 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