begin process at 2012 02 14 05:21:35
  Trouver un code source :
 
dans
 
Accueil > Forum > 

JAVA / J2EE / J2ME

 > 

Réseau & internet

 > 

Internet

 > 

Optimiser un transfert de fichier


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Optimiser un transfert de fichier

mercredi 19 juillet 2006 à 16:30:28 | Optimiser un transfert de fichier

seareal

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

mercredi 19 juillet 2006 à 17:15:08 | Re : Optimiser un transfert de fichier

neodante

Administrateur CodeS-SourceS
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 ?

++
mercredi 19 juillet 2006 à 17:50:27 | Re : Optimiser un transfert de fichier

sheorogath

Membre Club Administrateur CodeS-SourceS
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"
jeudi 20 juillet 2006 à 09:28:58 | Re : Optimiser un transfert de fichier

seareal

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



Cette discussion est classée dans : fichier, buffer, java, out, import


Répondre à ce message

Sujets en rapport avec ce message

Sockets.. fichier envoyé endomagé [ par gousalah ] Bonjour Voila mon probleme j'ai commencé a travaillé avec les sockets ... je veux envoyé des fichier a partie du client vers le serveurs... sa marche Deplacer un fichier local vers un server linux distant [ par mukolo mbombo ] salut All, j'ai crée ma classe avec java. mon application consiste à deplacer un fichier en local(windows) vers server distant(linux). Ma classe arriv socket fichier [ par aaratorn ] Bonjour à tous !J'ai un problème... je developpe un projet de synchro de repertoire en java et je pensais utilisé les sockets pour échange de fichiers java 6 et l'import static [ par adam12 ] J'ai aissayé de recommencer les base de java et comme il y'avait la version 6 de java j'ai essayé celle la avec eclips mais je n'arrive pas à utliser Ecriture dans un fichier [ par Darklecon ] Darklecon Serveur echo [ par wariom ] Bonjour, Voila, je voudrais faire un serveur echo mais j'ai des problemes avec les ObjectInputStream et companie <img src="http://www.developpez.net/f lire un fichier html [ par Nollla ] bsr a tous j ai le code suivant qui est affiche le message suivant au cours d'excution sur mon pc malgre qu'il fonctionne sur un autre pc alors le pb Ouvrir un fichier video avec son logiciel par defaut [ par dreamnos ] Bonjour,Je suis débutant et je cherche a ouvrir un fichier vidéo avec son logiciel par défaut sur windows. Mon code ouvre bien des fichiers image, des [JXL] Problème avec setBackGround [ par Mede12 ] Bonjour,J'ai commencé le Java il y a 1 mois environ,  j'ai appris par mes propres moyen ( en particulier avec des tutoriels trouvés sur internet notam


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,827 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales