Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Datei an Client schicken (IdTCP) (https://www.delphipraxis.net/52326-datei-client-schicken-idtcp.html)

storm1988 27. Aug 2005 22:20


Datei an Client schicken (IdTCP)
 
Moin

Bevor ich sinnlos rumprogrammiere wollt ich euch mal frage ob es überhaupt geht, dass man mit der Indy Komponente IdTCPServer Daten an den Client schickt?

Mfg

ManuMF 28. Aug 2005 11:29

Re: Datei an Client schicken (IdTCP)
 
Siehe hier.
Das muss dann natürlich genau andersrum passieren, eine Verbindung von Client zum Server vorausgesetzt.
Gilt für die Indys ab Version 10.

Gruß,
ManuMF

hflick 28. Aug 2005 12:45

Re: Datei an Client schicken (IdTCP)
 
Server sendet Dateien an den Client oder der Client an den Server.

Und ja, es ist möglich. Indy 10 hat im IOHandler entsprechende Methoden zum schreiben von Streams, also auch Dateien. Also wenn der Client
Delphi-Quellcode:
IOHandler.Write( myStream );
ausführt, wird der Strean an den Server "gesendet".

--
Holger

ManuMF 28. Aug 2005 13:35

Re: Datei an Client schicken (IdTCP)
 
@storm1988: Wenn du es wie in meinem Beispiel machst, musste du nur die Code-Zeilen im with-Bereich austauschen, und zwar

Delphi-Quellcode:
// Client

with Acontext.connection do
  begin
    try
      Socket.Write(IDS, 0, true);
    finally
      Disconnect;
    end;
  end;
und
Delphi-Quellcode:
// Server
with Acontext.connection do
  begin
    try
      SizeOfIncomingStream := Socket.ReadInteger;
      Socket.ReadStream(IDS, SizeOfIncomingStream);
    finally
      Disconnect;
    end;
  end;
Natürlich müssen auch die Streams andersrum behandelt werden (Open-Dialog bzw. feste Datei beim Server, Save-Dialog etc. beim Client).

Gruß,
ManuMF

storm1988 28. Aug 2005 16:21

Re: Datei an Client schicken (IdTCP)
 
Zitat:

Zitat von ManuMF
Siehe hier.
Das muss dann natürlich genau andersrum passieren, eine Verbindung von Client zum Server vorausgesetzt.
Gilt für die Indys ab Version 10.

Gruß,
ManuMF

Hallo danke mal für die vielen Informationen, aber funktioniert das auch bei größeren Dateien, oder muss ich die vorher noch splitten???

Mfg

hflick 28. Aug 2005 17:31

Re: Datei an Client schicken (IdTCP)
 
Indy 10 kann das automatisch. Das wird dann automatisch über einen Buffer etc. geregelt. Unter Indy 9 war das noch etwas komplizierter.

Antwort ist also: Dateien können beliebig gross sein.

--
Holger

ManuMF 28. Aug 2005 18:23

Re: Datei an Client schicken (IdTCP)
 
Habe es bis 560MB ausprobiert, ging tadellos (hat halt nur lange gedauert).

hflick 28. Aug 2005 18:25

Re: Datei an Client schicken (IdTCP)
 
geringe Bandbreite? :zwinker:

storm1988 28. Aug 2005 20:34

Re: Datei an Client schicken (IdTCP)
 
Hi Danke für die Infos :thumb:
Habs nämlich früher immer mit indy 9 realisiert und des war extrem umständlich......

storm1988 28. Aug 2005 22:02

Re: Datei an Client schicken (IdTCP)
 
Moin

Ich hät jetzt doch nochmal eine Frage zu deinem Source Code. Immer wenn ich mein Programm mit dem Code Compiliere kommt bei mir diese Fehlermeldung: Undefinierter Bezeichner: 'TidStreamVCL'. Muss ich da noch irgendwas zusätlich einbinden??

Mfg

ManuMF 28. Aug 2005 22:06

Re: Datei an Client schicken (IdTCP)
 
ja, "IdStreamVCL". Muss ich noch korrigieren.

@hflick: Naja, war in einem 100MBit/s-LAN. Aber lange ist relativ :zwinker:

[edit]@storm1988: Moin ist gut... :roll: [/edit]

storm1988 30. Aug 2005 11:36

Re: Datei an Client schicken (IdTCP)
 
So ich hab des verschicken mit die Datein so umgeschrieben, dass ich diese vom Server zum Client schicken kann. Jedoch wenn die die Datein größer als ca. 24 MB werden bekomme ich folgende Fehlermeldung : Der Prozess kann nicht auf die Datei zugreifen , da sie von einem anderen Prozess verwendet wird!!.

Hier mal mein umgeschriebener Source Code:

Client:

Delphi-Quellcode:
procedure DateiSendeButtonClick;

var FStream : TFileStream;
    SizeOfIncomingStream : Integer;
    IDS : TidStreamVCL;

begin

  { Die Streams initialisieren - Beim IDS wird FStream gleich eingelesen }
  FStream := TFileStream.Create(Pfad, fmCreate);
  IDS := TidStreamVCL.Create(FStream);

  { Senden }
 with frmServer.IdTCPClient1 do
  begin
      SizeOfIncomingStream := Socket.ReadInteger;;
      Socket.ReadStream(IDS, SizeOfIncomingStream);
  end;

  IDS.VCLStream.Position := 0;

  { Nicht vergessen ;-) }
  FStream.Free;
  IDS.Free;
end;
Und für den Server:

Delphi-Quellcode:
procedure KopierenToClient (AContext: TIdContext;Pfad : String);
var FSTream : TFileStream;
    SizeOfIncomingStream : Integer;
    IDS : TidStreamVCL;

begin

  FStream := TFileStream.Create(Pfad,fmOpenRead or fmShareDenyWrite)
  IDS := TidStreamVCL.Create(FStream);

  { Empfangen }
  with AContext.Connection do
  begin
      Socket.Write(IDS, 0, true);

  end;




  FStream.Free;
  IDS.Free;
end;
Könnte mir jetzt vielleicht wer sagen wo, dass Problem liegt?????

Mfg st0rm

ManuMF 30. Aug 2005 18:53

Re: Datei an Client schicken (IdTCP)
 
Siehe im anderen Thema ;-)


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