Bonjour, je dois réaliser un client/serveur qui doit permettre l'envoie de fichiers via TCP/IP, j'arrive à envoyer une chaîne de caractère, mais je bloque complètement pour les fichiers. J'ai commencé à faire un bout de code mais ça ne fonctionne pas. Pouvez-vous m'aider ?
Coté client :
SessionConnected
var
fs : TFileStream;
Buf : array[0..4095] Of Byte;
begin
fs:= TFileStream.Create('C:\Documents and Settings\Stagiaire3\a.pdf', fmOpenRead);
fs.Read(Buf, SizeOf(Buf));
fs.Write(Buf, SizeOf(Buf));
WSocket1.Send(fs, SizeOf(Buf));
end;
Coté serveur:
DataAvailable
var
fs : TFileStream;
Len : int64;
Buf : array[0..4095] Of Byte;
begin
//Création du Filestream
fs:= TFileStream.Create('C:\Documents and Settings\Stagiaire3\Bureau\azerty.pdf',fmCreate);
Len:= WSocket1.Receive(@Buf, SizeOf(Buf));
fs.Write(Buf, Len);
end;
type
TStreamPacket = record // 4Ko
FileName : shortstring;
FileSize : int64;
FileCRC : LongWord;
DataSize : integer;
Datas : array[0..StreamDataSize-1] of byte;
end;
const
StreamPacketSize = SizeOf(TStreamPacket);
envois :
var
RD : integer;
PQ : TStreamPacket;
begin
PQ.FileName := ExtractFileName(FileNameToSend);
with TFileStream.Create(FileNameToSend, fmOpenRead) do
try
PQ.FileSize := Size;
// PQ.FileCRC := CRC32(FileNameToSend); // voir mon api TinyHash
Position := 0;
PQ.DataSize := StreamDataSize;
while PQ.DataSize = StreamDataSize do
begin
PQ.DataSize := Read(PQ.Datas, StreamDataSize);
WSocket1.Send(PQ, StreamPacketSize);
end;
finally
free;
end;
end;
reception :
var
PQ : TStreamPacket;
NewSize : int64;
FileNameReceived: string;
begin
WSocket1.Receive(@PQ, StreamPacketSize);
FileNameReceveid := IncommingDirectory+PQ.FileName;
with TFileStream.Create(FileNameReceveid, fmCreate) do
try
if Size < PQ.FileSize then
begin
Position := Size-1;
Write(PQ.Datas, PQ.DataSize);
NewSize := Size;
end;
finally
free;
end;
{
if NewSize = PQ.FileSize then
if CRC32(FileNameReceveid) <> PQ.FileCRC then
// declancher une erreur de verification des sommes du fichier
}
end;
Merci beaucoup ça fonctionne parfaitement, j'ai juste fait une petite modif pour l'envoi :
WSocket1.Send(@PQ, StreamPacketSize);
Sinon j'avais une erreur de type.
J'ai testé avec un pdf de 2Mo et .doc de 50Ko. Le fichier se créé normalement, mais les fichiers ne pèsent que 250o et donc il n'y a rien de lisible dedans.
par contre un fichier txt de 3Ko fonctionne parfaitement.
type
TStreamPacket = record // 4Ko
FileName : shortstring;
FileSize : int64;
FileCRC : LongWord;
DataSize : integer;
Datas : array[0..StreamDataSize-1] of byte;
end;
const
StreamPacketSize = SizeOf(TStreamPacket);
envois :
var
RD : integer;
PQ : TStreamPacket;
begin
PQ.FileName := ExtractFileName(FileNameToSend);
with TFileStream.Create(FileNameToSend, fmOpenRead) do
try
PQ.FileSize := Size;
// PQ.FileCRC := CRC32(FileNameToSend); // voir mon api TinyHash
Position := 0;
PQ.DataSize := StreamDataSize;
while PQ.DataSize = StreamDataSize do
begin
PQ.DataSize := Read(PQ.Datas[0], StreamDataSize);
WSocket1.Send(PQ, StreamPacketSize);
end;
finally
free;
end;
end;
reception :
var
PQ : TStreamPacket;
NewSize : int64;
FileNameReceived: string;
begin
WSocket1.Receive(@PQ, StreamPacketSize);
FileNameReceveid := IncommingDirectory+PQ.FileName;
with TFileStream.Create(FileNameReceveid, fmCreate) do
try
if Size < PQ.FileSize then
begin
Position := Size-1;
Write(PQ.Datas[0], PQ.DataSize);
NewSize := Size;
end;
finally
free;
end;
{
if NewSize = PQ.FileSize then
if CRC32(FileNameReceveid) <> PQ.FileCRC then
// declancher une erreur de verification des sommes du fichier
}
end;
Je viens à nouveau d'essayer, comme dit précédemment un fichier de 4o(et pas 3Ko comme plus haut), ça fonctionne très bien, mais pour 59Ko et 2Mo ça ne marche plus, un fichier est généré portant le nom de celui de l'envoi qui fait 224o et un autre avec un nom bizarre qui n'a aucune extension.
Merci pour le lien précédent, mais je n'arrive toujours pas à envoyer de gros fichiers, et il faut impérativement que j'utilise les WSocket, comment pourrais-je faire un envoi de plusieurs paquets d'un fichier ?
Ben tu envoies par exemple 50K par 50K et tu envoies dans chaque paquet le numéro du paquet, ainsi que le nombre de paquets. A la fin, le destinataire a tous les paquets, il n'a plus qu'à reconstituer le fichier dans l'ordre de paquets ?
Je viens de regarder attentivement l'envoi, en fait ça l'envoi bien par paquets, avec la bonne taille par rapport au fichier d'origine, seulement le poids du fichier reçu est celui du dernier paquet envoyé, comment remédier à celà ?
"Je viens de regarder attentivement l'envoi, en fait ça l'envoi bien par paquets, avec la bonne taille par rapport au fichier d'origine, seulement le poids du fichier reçu est celui du dernier paquet envoyé"
J'imagine que c'est un problème d'envoi séquentiel des paquets au niveau de l'émetteur des paquets ...
Je ne sais pas trop, en tout cas à la réception les tailles des paquets sont identiques à celles de l'envoi, je pense que c'est l'écriture du fichier qui ne fonctionne pas, mais je ne vois pas où.