![]() |
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 |
Re: Frage zu Dateiransfer mit Indy
|
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.
|
Re: Frage zu Dateiransfer mit Indy
Ja, das geht. Sobald due einen TIdPeerThread hast, kannst du mit
Delphi-Quellcode:
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.
Connection.WriteBuffer(MessageRecord, SizeOf(MessageRecord), True);
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 ...) |
Re: Frage zu Dateiransfer mit Indy
also
im Event von ServerExecute(AThread: TIdPeerThread) --> AThread.Connection.Socket.Binding.ID ? |
Re: Frage zu Dateiransfer mit Indy
Also unter Indy 10 sollte es so laufen:
Delphi-Quellcode:
(Hab ich aus der Doku - oder aus dem, was ich dafür halte ^^)
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; 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:
Aber ich hatte schon ewig nix mehr damiit gemacht ...
TMyForm.ServerExecute(AThread: TIdPeerThread);
begin AThread.Connection.WriteBuffer('Hallo Welt', length('Hallo Welt'), True); end; |
Re: Frage zu Dateiransfer mit Indy
Aha. Aber mit WriteBuffer wird dann nix mit Datei senden. Eher doch WriteFile oder WriteStream, oder?
|
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. |
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 02:45 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