beudet
Messages postés122Date d'inscriptionvendredi 19 octobre 2007StatutMembreDernière intervention24 février 2011
-
30 mars 2009 à 11:52
beudet
Messages postés122Date d'inscriptionvendredi 19 octobre 2007StatutMembreDernière intervention24 février 2011
-
11 mai 2009 à 09:04
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;
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 30 mars 2009 à 15:30
type comun:
const
StreamDataSize = 4096-256-8-4-4;
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;
beudet
Messages postés122Date d'inscriptionvendredi 19 octobre 2007StatutMembreDernière intervention24 février 2011 30 mars 2009 à 16:17
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.
beudet
Messages postés122Date d'inscriptionvendredi 19 octobre 2007StatutMembreDernière intervention24 février 2011 30 mars 2009 à 17:30
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.
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 30 mars 2009 à 18:01
type comun:
const
StreamDataSize = 4096-256-8-4-4;
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;
beudet
Messages postés122Date d'inscriptionvendredi 19 octobre 2007StatutMembreDernière intervention24 février 2011 31 mars 2009 à 09:51
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.
beudet
Messages postés122Date d'inscriptionvendredi 19 octobre 2007StatutMembreDernière intervention24 février 2011 2 avril 2009 à 10:52
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 ?
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 2 avril 2009 à 16:58
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 ?
beudet
Messages postés122Date d'inscriptionvendredi 19 octobre 2007StatutMembreDernière intervention24 février 2011 6 avril 2009 à 13:44
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à ?
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 8 avril 2009 à 16:58
"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 ...
beudet
Messages postés122Date d'inscriptionvendredi 19 octobre 2007StatutMembreDernière intervention24 février 2011 8 avril 2009 à 17:23
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ù.