begin process at 2010 02 10 05:23:11
  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

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 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 Ecrire dans un fichier avec Java!!!!!!!!!!!!! [ par allia007 ] Bonjour, j'ai un petit problème avec Java, voila je veux écrire dans un fichier une suite de valeur donc j'ai mis la methode println dans une boucle.l Valeurs Hexadecimals d'un fichier [ par liipod ] Bonjour, je voudrais afficher les valeurs en hexadécimal d'un fichier, comme quand il est ouvert avec un "éditeur hexadécimal". voila mon code sourc comparaison de 2 fichiers texte (pb boucle while je pense) [ par tomski ] Bonjour,Jessaye de comparer 2 fichiers texte ligne par ligne.Chaque ligne est decoupee (split(";")) et chaque mot est stocké dans un array.Ensuite je PROBLEME DE FICHIER [ par daryussssssss ] Bonjours, je suis actuellement en train de crée un carnet d'adresse et j'ai un petit probleme, c 'est qu'en faite j'enregistre les données dans un fic aider moi svp **les fichiers en java***** [ par d12ahm ] salut at monde j'ai un parser SAX en java et j'ai essayer de save le resultat dans un fichier "txt" j'ai les eles suivant a b c mais quan 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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

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,281 sec (4)

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