begin process at 2008 08 22 02:25:07
1 229 759 membres
30 nouveaux aujourd'hui
14 267 membres club

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)

Optimiser un transfert de fichier le 19/07/2006 16:30:28

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


Re : Optimiser un transfert de fichier le 19/07/2006 17:15:08

neodante
(Admin CS)
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 ?

++

Re : Optimiser un transfert de fichier le 19/07/2006 17:50:27

sheorogath
Membre Club
(Admin CS)
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"

Re : Optimiser un transfert de fichier le 20/07/2006 09:28:58

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



Classé sous : fichier, buffer, java, out, import

Participer à cet échange

Pub



Appels d'offres

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

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

Boutique

Boutique de goodies CodeS-SourceS