Autor Beitrag
MarkusBauer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70

Win XP Pro
Delphi 7 PE+Indy
BeitragVerfasst: So 16.12.07 21:12 
Hallo,
ich übertrage eine Datei über Lan mit Indy TCP.
Hier der Quellcode:
Client:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
        fStream := TFileStream.Create(ExtractFileDir(ParamStr(0)) + '\files\' + sAction,fmOpenRead  + fmShareDenyNone);
        // copy file stream to write stream
        AThread.Connection.OpenWriteBuffer;
        AThread.Connection.WriteStream(fStream,true,true,0);
        AThread.Connection.CloseWriteBuffer;
        // free the file stream
        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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2

Win XP
Delphi 2007 Prof. Codegear Win32
BeitragVerfasst: Mo 17.12.07 15:10 
Hi

Normalerweise benutze ich die Stream-Sende Methode der Indys nicht aber folgendes ist mir aufgefallen :

ausblenden 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