MarkusBauer - So 16.12.07 21:12
Titel: Datei übertragen mit idTCP und Statusanzeige
Hallo,
ich übertrage eine Datei über Lan mit Indy TCP.
Hier der Quellcode:
Client:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| with IdTCPClient do begin Connect; WriteLn('GET:' + Listbox1.Items[Listbox1.itemindex]); ftmpStream := TFileStream.Create(ExtractFileDir(ParamStr(0)) + '\files\' + Listbox1.Items[Listbox1.itemindex],fmCreate); fsize := ReadInteger; ReadStream(fTmpStream,fsize); FreeAndNil(fTmpStream); Disconnect; end; |
Server:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| fStream := TFileStream.Create(ExtractFileDir(ParamStr(0)) + '\files\' + sAction,fmOpenRead + fmShareDenyNone); AThread.Connection.OpenWriteBuffer; AThread.Connection.WriteStream(fStream,true,true,0); AThread.Connection.CloseWriteBuffer; FreeAndNil(fStream); AThread.Connection.Disconnect; |
Dies funktioniert auch , solange ich kleinere Dateien (1,5-2KB) übertrage.
Doch bei größeren Dateien (50MB) hängt sich der Client auf und muss mit dem Taskmanager beendet werden. Dies liegt nicht an der Übertragungsdauer, da nach mehreren Minuten immer noch 0Byte in die Zieldatei geschrieben waren.
Ich habe die Vermutung, dass dies daran liegt, dass der fsize-Wert nur bis 2 Mio. geht.
Wie kann ich dieses Problem beheben?
PS: Ist es möglich, beim Download eine Statusanzeige zu erstellen?
Danke
Markus
Quitzlinga - Mo 17.12.07 15:10
Hi
Normalerweise benutze ich die Stream-Sende Methode der Indys nicht aber folgendes ist mir aufgefallen :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| with IdTCPClient do begin Connect; WriteLn('GET:' + Listbox1.Items[Listbox1.itemindex]); ftmpStream := TFileStream.Create(ExtractFileDir(ParamStr(0)) + '\files\' + Listbox1.Items[Listbox1.itemindex],fmCreate); fsize := ReadInteger; ReadStream(fTmpStream,fsize); FreeAndNil(fTmpStream); Disconnect; end; |
Das ist Korrekt, denn schließlich muss dein Stream ja wissen, wieviel Daten er einliest, aber wo übermittelst Du die zu sendende Grösse im Server ?
Was dein zweites Problem angeht : Du benötigst ein Protokoll (Giebts dutzende Beispiel hier im Forum). So bist du in der Lage, die Datei dann 'scheibenweise' zu übermitteln und pro 'Scheibe' eine Geschwindigkeitsmessung zu machen. Hab ich selber so realisiert und funktioniert wunderbar.
MfG
Quitzlinga