Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Frage zu Dateiransfer mit Indy (https://www.delphipraxis.net/122890-frage-zu-dateiransfer-mit-indy.html)

Bit_Solo 23. Okt 2008 22:53


Frage zu Dateiransfer mit Indy
 
Hallo,

hoffe ich bin im richtigen Forum.
Man kann ja mit Hilfe von einer idTCPClient Kompo eine Datei an einen idTCPServer übermitteln. Ist es möglich, das ich auch vom idTCPServer eine Datei an einen idTCPClient sende?
Wenn ja, evtl. einen kleinen Hinweis in die richtige Richtung.
Ich goolge und suche nun schon eine Weile, aber finde halt nur vom Client zum Server.

Danke

hincapie 24. Okt 2008 07:32

Re: Frage zu Dateiransfer mit Indy
 
Schau Dir mal diesen Thread an:
Beispiel zum Versenden von Dateien mit Indy

Bit_Solo 24. Okt 2008 18:25

Re: Frage zu Dateiransfer mit Indy
 
Ja, das kenne ich. Meine Frage ist aber, ob der Server auch ein File an den Client senden kann. Ist ja in dem Beispiel nicht so.

jfheins 24. Okt 2008 18:41

Re: Frage zu Dateiransfer mit Indy
 
Ja, das geht. Sobald due einen TIdPeerThread hast, kannst du mit
Delphi-Quellcode:
Connection.WriteBuffer(MessageRecord, SizeOf(MessageRecord), True);
Daten versenden. Den TIdPeerThread bekommst du entweder in einem Event, oder du speicherst sie in einem Array (Beim Connecten entsteht ein Event mit einem PeerThread) zwischen.

Möglicherweise hat der TIdTCPServer auch eine Liste, da könntest du es auch herbekommen.

(Kann aber sein, dass das bei einer anderen Indy-Version anders ist ...)

Bit_Solo 24. Okt 2008 19:07

Re: Frage zu Dateiransfer mit Indy
 
also
im Event von ServerExecute(AThread: TIdPeerThread) --> AThread.Connection.Socket.Binding.ID ?

jfheins 24. Okt 2008 19:37

Re: Frage zu Dateiransfer mit Indy
 
Also unter Indy 10 sollte es so laufen:
Delphi-Quellcode:
TMyForm.MyServerExecute(AContext: TIdContext);
  var
    lCmd: string;
  begin
    lCmd := Trim(AContext.Connection.IOHandler.ReadLn);
    if AnsiSameText(lCmd, 'HELP') then
    begin
        AContext.Connection.IOHandler.WriteLn('HELP');
        AContext.Connection.IOHandler.WriteLn('QUIT');
        AContext.Connection.IOHandler.WriteLn('GETTIMESTAMP');
        AContext.Connection.IOHandler.WriteLn('');
    end

    else if AnsiSameText(lCmd, 'QUIT') then
    begin
        AContext.Connection.IOHandler.WriteLn('Goodbye...');
        AContext.Connection.IOHandler.WriteLn('');
        AContext.Connection.Disconnect;
    end

    else if AnsiSameText(lCmd, 'GETTIMESTAMP') then
    begin
        AContext.Connection.IOHandler.WriteLn(
          FormatDateTime(Now, 'yyyy-mm-ddThh:nn:ss.zzz'));
        AContext.Connection.IOHandler.WriteLn('');
    end;
  end;
(Hab ich aus der Doku - oder aus dem, was ich dafür halte ^^)

Und unter Indy 9 sollte wie oben beschriben laufen: Du bekommst einen TIdPeerThread und dieser hat direkt die Merhode WriteBuffer.

Also so ähnlich:
Delphi-Quellcode:
TMyForm.ServerExecute(AThread: TIdPeerThread);
  begin
    AThread.Connection.WriteBuffer('Hallo Welt', length('Hallo Welt'), True);
  end;
Aber ich hatte schon ewig nix mehr damiit gemacht ...

Bit_Solo 24. Okt 2008 19:42

Re: Frage zu Dateiransfer mit Indy
 
Aha. Aber mit WriteBuffer wird dann nix mit Datei senden. Eher doch WriteFile oder WriteStream, oder?

jfheins 24. Okt 2008 19:48

Re: Frage zu Dateiransfer mit Indy
 
Naja, du kannst dir im Grunde die Methode nehmen, die dir am besten gefällt - ich glaube intern verrwenden die alle am Ende WriteBuffer.

Aber mit WriteStream gehts bei Dateien natürlich besser weil man da direkt den FileSStream übergeben kann. Am besten vorher die Größe übermitteln damit du am andern Ende wieder weist, wieviel du lesen musst.

Bit_Solo 24. Okt 2008 20:47

Re: Frage zu Dateiransfer mit Indy
 
Danke. Hat geklappt. Kämpfe nur noch mit'm Progressbar bei Client.


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