So, noch mal gesucht:
Das hier muss ins OnClientRead Ereigniss des TClientSockets:
Delphi-Quellcode:
Var
a: array[0..4096] of byte;
i: integer;
s: string;
fs: tfilestream;
begin
If FDaten = false then
begin
s := Socket.ReceiveText;
If Copy(s, 1, 5) = 'Daten' then
begin
Delete(s, 1, 5);
try
FSize := StrToInt(s);
FDaten := true;
FStream.Clear;
except
end;
end;
end
else
begin
i := Socket.ReceiveBuf(a, 4096);
FStream.Write(a, i);
FPos2 := FPos2 + i;
// hiermit prozent ermitteln: floattostr(Round((fpos2 / fsize)*100));
If FPos2 >= FSize then
begin
FDaten := false;
FStream.Position := 0;
FPos2 := 0;
end;
end;
FDaten: boolean;
FSize: int64;
Fpos2: int64;
FStream: TMemoryStream;
als globale Veriablen definieren!
und das hier muss zum Senden benutzt werden:
Delphi-Quellcode:
procedure SendFileToClient(clientindex: integer; filename: string);
Var i: integer; Buf: Pointer;
begin
fstream.LoadFromFile(filename);
Buf := FStream.Memory;
serversocket1.Socket.connections[clientindex].SendText('Daten'+inttostr(fstream.size));
sleep(sleeptime+50);
serversocket1.Socket.connections[clientindex].SendBuf(buf^, fstream.Size);
end;
ClientIndex gibt die Nummer des Clients an.
Florian
PS: Ja, es geht auch mit den normalen Komponenten.