hab folgendes problem
hab
indy tcp client und server eingesetzt ( neuste version )
und damit will ich dateien transferieren
wenn ich das nun im lan mache kann ich zwar fehlerfrei transferieren aber:
1. transfer wird nach start immer langsamer bis etwa < 200 kbs @ lan !
2. client braucht knappe 80-90% CPU wärend dem transfer
3. client hat ca 40 - 50 MB an größe im
ram wärend dem transferieren ( danach nimmer )
server hat immer 1-4% CPU auslastung und normale größe im
RAM ( 4-5MB )
wenn ich übers internet transferiere hab ich noch folgendes problem dazu:
1. z.b. eine 30mb datei wird in 1min übertragen ( hab normales DSL )
und 2. datei ist dann aufm zielrechner 30mb groß, is aber CRC mäßig kaputt ( streaming funzt wohl net richtig )
aber im lan is CRC ok nach dem transferieren !!
client code:
Delphi-Quellcode:
fs := TFileStream.Create(uploadfile, fmOpenRead or fmShareDenyWrite); //Datei in FileStream einlesen
form1.filebar.Max := fs.Size;
form1.Label12.Caption := inttostr(fs.Size);
form1.filebar.Position := 0;
try
form1.client.OpenWriteBuffer;
form1.timer1.enabled := true;
try
form1.client.WriteStream(fs,true,true);
form1.client.CloseWriteBuffer;
except
form1.client.CancelWriteBuffer;
end;
finally
form1.timer1.enabled := false;
fs.free;
end;
form1.filebar.Position := 0;
form1.Label12.Caption := '--';
form1.Label10.Caption := '--';
form1.Label14.Caption := '--';
uploadoldstreampos := 0;
tcpclient einstellungen:
receive/send buffer: 32768 ( schon mehr und weniger getestet.. hat sich nix geändert )
ascii filter: false
maxlinelenght: 16384
maxlineaction: maException ( wird nich ausgelöst )
server code:
Delphi-Quellcode:
if (cmd = 'uplo') then begin
if fileexists(Tfilelistbox(actclient.fileb).Directory+'\'+data) then begin
athread.Connection.WriteLn('uploEXS');
end else begin
athread.Connection.WriteLn('uploOK');
fs := TFileStream.Create(Tfilelistbox(actclient.fileb).Directory+'\'+data, fmCreate or fmShareExclusive);
with AThread.Connection do begin
try
SizeOfIncomingStream := ReadInteger; //Größe des Streams empfangen
ReadStream(fs, SizeOfIncomingStream); //und übergeben
finally
fs.Free;
end;
end;
end;
end; // upload
die progressbar is übrigends schön am worken
einfach alle paar sekunden fs.position auslesen
( hab ich auch schon weggelassen aber hat nix ausgemacht )
hat mir da einer ne idee ?
will jetzt net grad das mit dem filesplitten machen.. muss doch so auch gehen ?!
oder kann ich auch alternativ per writeln die ganze datei rüberbeamen bis ende erreicht usw ? oder is das noch schlechter wegen speed
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!