Optimiser un transfert de fichier

seareal Messages postés 24 Date d'inscription mardi 20 juillet 2004 Statut Membre Dernière intervention 8 juin 2011 - 19 juil. 2006 à 16:30
seareal Messages postés 24 Date d'inscription mardi 20 juillet 2004 Statut Membre Derniè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();  
   }
}

//----------------------- Classe Serveur
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.RandomAccessFile;
import java.net.ServerSocket;
import java.net.Socket;


public class Serveur extends Thread
{
 public Serveur()
 {
  this.start();
 }
 
 public void run()
 {
  try
  {
    ServerSocket socketEcoute = new ServerSocket(8008);
    Socket socketClient = socketEcoute.accept();
    
       DataInputStream in = new DataInputStream(socketClient.getInputStream());
       DataOutputStream out = new DataOutputStream(socketClient.getOutputStream());
      
       RandomAccessFile fluxSortie = new RandomAccessFile("c:\\fichier_transfere","rw");
      
       String message = "";
       while (!message.equals("END"))
       {     
     // Creation d'un tampon de stockage
     byte[] buffer_receive = new byte[1024];
     
     // Lecture du message sur le flux d'entree
     int size_msg = 0;
     
     size_msg = in.read(buffer_receive, 0, buffer_receive.length);
     
     fluxSortie.write(buffer_receive);
     
     if (size_msg >= 0)
      message = new String(buffer_receive, 0, size_msg); 
     
     if (!message.equals("END"))
     {
      out.write("OK".getBytes());
      out.flush();      
     }
       }
   }
   catch(Exception e) {}
  }
}

//---------------------- Classe Client
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Date;


public class Client extends Thread
{
 public Client()
 {
  this.start();
 }
 
 public void run()
 {
  try
  {
   //envoiSimple();
   envoiFichier();
  }
  catch (Exception e) {e.printStackTrace();}
 }


 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");
 }
}

3 réponses

cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
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 ?

++
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
19 juil. 2006 à 17:50
3mo sur internet ? :o
si oui je trouve ca enorme
si c'est sur un reseau local c'est pas mal du tout quand meme

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
seareal Messages postés 24 Date d'inscription mardi 20 juillet 2004 Statut Membre Derniè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
0
Rejoignez-nous