beudet
Messages postés122Date d'inscriptionvendredi 19 octobre 2007StatutMembreDernière intervention24 février 2011
-
11 mai 2009 à 09:12
Bonjour,
je dois effectuer un transfert de fichier par tcp grâce au composant twsocket mais je n'arrive pas à envoyer un gros fichier(10 Mo) de façon stable, par contre une image de 100 Ko est toujours envoyée et bien reçue. Pourriez-vous m'aider ?
Voici le code :
Type commun :
const
StreamDataSize = 1024;
type
TStreamPacket = record
FileName : shortstring;
FileSize : int64;
DataSize : integer;
NbPacket : Integer;
Datas : array[0..StreamDataSize-1] of Byte;
end;
const
StreamPacketSize = SizeOf(TStreamPacket);
Côté serveur :
procedure TForm1.WSocket1DataAvailable(Sender: TObject; ErrCode: Word);
var
PQ : TStreamPacket;
Len : Integer;
begin
Len:= WSocket1.Receive(@PQ, StreamPacketSize);
ii:= ii + 1;
if (ii <> PQ.NbPacket) then ii:= ii - 1;
Memo1.Lines.Add('Nombre de paquets : ' + IntToStr(ii));
Memo1.Lines.Add('Nombre de paKets : ' + IntToStr(PQ.NbPacket));
Memo1.Lines.Add('Total : ' + IntToStr(PQ.FileSize));
Memo1.Lines.Add('Données : ' + IntToStr(PQ.DataSize));
Memo1.Lines.Add('Compteur : ' + IntToStr(Compt));
Memo1.Lines.Add('Position : ' + IntToStr(FStream.Position));
Memo1.Lines.Add('Taille du paquet : ' + IntToStr(StreamPacketSize));
if (Len <= 0) then Exit;
try
if (FStream.Size < PQ.FileSize) then begin
if (ii = PQ.NbPacket) then begin
Compt:= Compt + PQ.DataSize;
Memo1.Lines.Add('Taille Avant : ' + IntToStr(FStream.Size));
Memo1.Lines.Add('Position Avant : ' + IntToStr(FStream.Position));
FStream.Write(PQ.Datas[0], PQ.DataSize);
Memo1.Lines.Add('Données : ' + IntToStr(PQ.DataSize));
FStream.Position:= Compt;
Memo1.Lines.Add('Taille Après : ' + IntToStr(FStream.Size));
Memo1.Lines.Add('Position Après : ' + IntToStr(FStream.Position));
end;
end;
finally
Memo1.Lines.Add('Taille finale : ' + IntToStr(FStream.Size));
Memo1.Lines.Add('');
end;
WSocket1.ProcessMessages;
WSocket1.SendStr('OK ' + IntToStr(ii) + ' ');
WSocket1.ProcessMessages;
end;
Côté client :
procedure TForm1.WSocket1SessionConnected(Sender: TObject; ErrCode: Word);
var
PQ : TStreamPacket;
begin
if (ErrCode <> 0) then
Memo1.Lines.Add('Impossible de se connecter, erreur #' + IntToStr(ErrCode))
else begin
Memo1.Lines.Add('== Connecté ==');
PQ.FileName:= ExtractFileName('C:\Documents and Settings\Stagiaire3\test.jpg');
FStream:= TFileStream.Create('C:\Documents and Settings\Stagiaire3\test.jpg', fmOpenRead);
try
PQ.FileSize:= FStream.Size;
FStream.Position:= 0;
while (FStream.Position <> FStream.Size) do begin
ii:= ii + 1;
PQ.DataSize:= FStream.Read(PQ.Datas[0], StreamDataSize);
Memo1.Lines.Add('Position : ' + IntToStr(FStream.Position));
PQ.NbPacket:= ii;
Memo1.Lines.Add(IntToStr(WSocket1.BufSize));
WSocket1.Send(@PQ, StreamPacketSize);
Memo1.Lines.Add('DATAS ' + IntToStr(PQ.DataSize));
Compt:= Compt + PQ.DataSize;
Memo1.Lines.Add('Compteur ' + IntToStr(Compt));
Memo1.Lines.Add('Nombre de paquets : ' + IntToStr(ii));
Memo1.Lines.Add('Taille du paquet entier : ' + IntToStr(StreamPacketSize));
WSocket1.ProcessMessages;
end;
finally
FStream.Free;
Memo1.Lines.Add('Nombre de paquets : ' + IntToStr(ii));
end;
end;
end;