Envoyer un fichier via les Sockets (Problème de taille de fichier)
Bonjour, je souhaite transférer un fichier de plus de 10Mo par les sockets, le problème c'est que mon fichier à l'arrivé est divisé en plusieurs fichiers qui oscillent entre 2 et 8Ko.
J'ai essayé de modifier la taille du Buffer mais ça n'a rien changé, j'ai du passer à coté de quelque chose, voici mon code:
côté client:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
private int dataBufferSize = 512; public byte[] dataBuffer;
private int bufferSize = 512; public byte[] buffer;
public byte[] preparerMessage(message unMessage)
{
//serialisation de mon instance de classe en xml
StreamWriter writer = File.CreateText(@"serializedmessage.xml");
XmlSerializer x = new XmlSerializer(typeof(message));
x.Serialize(writer, unMessage);
writer.Close();
// Read the file into a MemoryStream
FileStream inStream = File.OpenRead(@"serializedmessage.xml");
MemoryStream storeStream = new MemoryStream();
// copy all data from in to store
storeStream.SetLength(inStream.Length);
inStream.Read(storeStream.GetBuffer(), 0, (int)inStream.Length);
// clean up
storeStream.Flush();
inStream.Close();
storeStream.Seek(0, 0);
return storeStream.ToArray();
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| public void envoyer(byte[] unMessage)
{
if (!estConnecte)
{
//vaffich("La connexion au serveur est interrompue,.connected");
return;
}
if (!(ClientSocket.Poll(10, SelectMode.SelectWrite) && ClientSocket.Available == 0))
{
//La connexion a été clôturée par le serveur ou bien un problème réseau est apparu
//vaffich("La connexion au serveur est interrompue,send");
estConnecte = false;
}
else
{
try
{
buffer = unMessage;
int DtSent = ClientSocket.Send(buffer, buffer.Length, SocketFlags.None);
if (DtSent == 0)
{
//vaffich("Aucune donnée n'a été envoyée");
}
else
{
//vaffich("message envoye : " + monmessage.getmessage());
}
}
catch (Exception ex)
{
//vaffich("La connexion au serveur est interrompue pbs :" + ex);
estConnecte = false;
}
}
} |
côté serveur:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| public void lecturedelegate()
{
readList.Clear();
//méthode qui permet de vérifier si données reçues boucle sur tous les sockets client
// utilise une collection nouvelle car deconnexion possible pendant ce traitement
for (int i = 0; i < acceptList.Count; i++)
{
readList.Add((Socket)acceptList[i]);
}
if (readList.Count > 0) //y a t'il un client
{
Socket.Select(readList, null, null, 1000);//ne sélectionne que les sockts prets a ici à etre lu
for (int i = 0; i < readList.Count; i++)
{
if (((Socket)readList[i]).Available > 0) //a t'on reçu des données de ce socket client
{
readLock = true; //bloque la possibilité de supprimer pendant ce temps ce socket si déconnexion
while (((Socket)readList[i]).Available > 0)
{
buffer = new byte[((Socket)readList[i]).Available];
((Socket)readList[i]).Receive(buffer, buffer.Length, SocketFlags.None);
}
try
{
//génération d'un fichier xml
Random RandomClass = new Random();
int RandomNumber = RandomClass.Next();
string fileName = @"messages\" + RandomNumber.ToString() + @".xml";
FileStream writer = File.Create(fileName);
writer.Close();
//met le buffer dans un memory stream
MemoryStream ms = new MemoryStream();
ms.Write(buffer, 0, buffer.Length);
ms.Seek(0, 0);
//ecriture du fichier
FileStream outStream = File.OpenWrite(fileName);
ms.WriteTo(outStream);
outStream.Flush();
outStream.Close();
//deserialisation du xml
cpaclient.message monMessage = new cpaclient.message();
StreamReader reader = File.OpenText(fileName);
XmlSerializer x = new XmlSerializer(typeof(cpaclient.message));
monMessage = (cpaclient.message)x.Deserialize(reader);
reader.Close();
}
catch (Exception ex)
{
}
}
readLock = false; //on accepte de spprimer ce socket client si deconnexion
}
}
} |