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