seareal
Messages postés24Date d'inscriptionmardi 20 juillet 2004StatutMembreDernière intervention 8 juin 2011
-
19 juil. 2006 à 16:30
seareal
Messages postés24Date d'inscriptionmardi 20 juillet 2004StatutMembreDernière intervention 8 juin 2011
-
20 juil. 2006 à 09:28
Bonjour,
J'effectue un transfert de fichiers par réseau et j'obtiens un débit approximatif de 3 Mo/s, alors que je suis censé pouvoir allé au-delà. Ci-dessous le code utilisé pour ce transfert, le code est largement épuré (taille finale de fichier non traitée, coupure réseau, etc..) mais fonctionnel et permet de mettre au point un transfert rapide avant de corriger les imperfections.
Ma question est : y a-t-il des optimisations à faire pour améliorer les performances du transfert?
Encore une fois, merci pour votre aide
public class Main
{
public static void main(String[] args)
{
new Serveur();new Client();
}
}
private void envoiSimple() throws UnknownHostException, IOException
{
Date t = new Date();
Socket socketClient = new Socket("127.0.0.1", 8008);
DataInputStream in = new DataInputStream(socketClient.getInputStream());
DataOutputStream out = new DataOutputStream(socketClient.getOutputStream());
// Creation d'un tampon de stockage
byte[] buffer_receive = new byte[1024];
for (int i = 0; i < 10 * 1024; i++)
{
out.write(buffer_receive);
out.flush();
in.read();
}
out.write("END".getBytes());
out.flush();
System.out.println("Transfert de 10 Mo en " + (new Date().getTime() - t.getTime()));
}
private void envoiFichier() throws UnknownHostException, IOException
{
Date t = new Date();
Socket socketClient = new Socket("127.0.0.1", 8008);
DataInputStream in = new DataInputStream(socketClient.getInputStream());
DataOutputStream out = new DataOutputStream(socketClient.getOutputStream());
// ouverture de flux sur le fichier à envoyer
RandomAccessFile fic = null;
int tailleF = 0;
fic = new RandomAccessFile ("C:\\fichier_a_envoyer","r");
tailleF = (int) fic.length();
// quelques initialisations
byte[] buffer_send = new byte[1024]; // buffer de lecture dans le fichier int fichierfini -1; // 0 lorsque le fichier aura été entièrement envoyé
while (fichierfini !=0)
{
// Lecture du fichier d'entrée dans le buffer
int octets_lus = 0; // nombre d'octets lus
octets_lus = fic.read(buffer_send, 0, buffer_send.length - 4);
out.write(buffer_send);
out.flush();
in.read();
// teste si le fichier source a été entièrement parcourru
fichierfini = (int) (fic.length() - fic.getFilePointer());
}
// Boucle d'envoi terminée : soit envoi fini, soit erreur
out.write("END".getBytes());
out.flush();
// Dans tous les cas, fermeture du fichier en lecture
fic.close();
in.close();
out.close();
float tps = (new Date().getTime() - t.getTime()) / 1000F; if (tps 0) tps 1;
System.out.println(tailleF + " octets copiés en " + (new Date().getTime() - t.getTime()) + "ms");
}
}
cs_neodante
Messages postés2835Date d'inscriptionlundi 11 août 2003StatutModérateurDernière intervention16 décembre 200611 19 juil. 2006 à 17:15
Essaye les NIO pour l'optimisation de performance, mais attention c'est beaucoup plus compliqué que les socket classique puisque c'est toi qui gère le buffer d'envoi/réception par exemple.
Cependant je ne pense pas que cela soit vraiment la cause bien qu'un débit de 3Mo est déjà super bien . Qu'est ce qui te fait dire que tu as une capacité supérieur ?
seareal
Messages postés24Date d'inscriptionmardi 20 juillet 2004StatutMembreDernière intervention 8 juin 2011 20 juil. 2006 à 09:28
c'est dans un réseau local, et si je copie 1 Go, j'obtiens un débit de ~9 Mo/s. Alors certes, je me doute bien que ce n'est pas en java que je pourrai m'approcher significativement de ces performances (je risque pas d'aller plus vite que le système, je me doute bien) mais un rapport de 30% d'efficacité, cela me semble un peu juste.
M'enfin, si vous dites que c'est bien, ça me rassure mais je vais quand meme creuser cette histoire de NIO