Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Optimiser un transfert de fichier [ Réseau & internet / Internet ] (seareal)

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é dans : fichier, buffer, java, out, import


Répondre à ce message

Sujets en rapport avec ce message

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 [java]creation de fichier ... [ par suber600 ] voila je dois creer un fichier composé d entier et de double. le fichier ne doit pas etre lisible par un editeur de texte comment dois je faire ? je v [jsp & java] Lancer une application [ par Lochan ] Salut à tous J'ai écrit un programme en java qui écrit dans un fichier text et qui lance un fichier excel (qui contient une macro). Lorsque je lance


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,328 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.