Bonjour,
J'ai un client/serveur sur un réseau local, a un moment, il y a copie de fichiers.
J'ai déjà créé des fonctions pour faire tout ça avec des buffers et tout ça, mais je m'aperçois que la vitesse de transfert est plutôt lente..
Quelle est la vitesse max de copie sur un réseau local ? elle devrait pouvoir atteindre (quasi) la vitesse de transfert du ssh non ?
si je copie mon fichier directement en copier/coller via le protocole smb, je vais a environ 5Mo/s. Si je fais via scp, je vais à plus de 10Mo/s
par contre, avec une copie via java, je mets... je sais même pas quelle est la vitesse, c'est tellement lent que je l'arrête avant...
j'ai essayé de changer la taille du buffer, rien y fait..
est il possible de copier avec java des gros fichiers tout en ayant un gros débit ?
si oui, comment fais on ?
voici comment je fais mes copie (je suppose que ce n'est pas le meilleur moyen !) :
serveur :
client :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105 public int sendFile (String pathname) { int retour = Proprietes.ACK; File f = new File(pathname); ByteArrayOutputStream baos = new ByteArrayOutputStream(); BufferedOutputStream bos = new BufferedOutputStream(baos); OutputStream os = null; try { os = socket.getOutputStream(); } catch (IOException e1) { e1.printStackTrace(); } int[] aecrire = new int[TAILLE_BUFFER]; int compteur = 0; long ouonestrendu = 0; int lu = -1; BufferedInputStream bis = null; try { bis = new BufferedInputStream(new FileInputStream(f)); } catch (FileNotFoundException e) { e.printStackTrace(); } try { lu = bis.read(); } catch (IOException e) { e.printStackTrace(); } //Tant qu'on est pas à la fin fu chier while(lu > -1) { // On lit les données du fichier aecrire[compteur] = lu; try { lu = bis.read(); } catch (IOException e) { e.printStackTrace(); } compteur++; //Quand on a rempli le tableau, on envoie un paquet de TAILLE_BUFFER octets if(compteur == TAILLE_BUFFER){ compteur=0; ouonestrendu++; // On remplit le tampon for(int x=0;x<TAILLE_BUFFER;x++){ try { bos.write(aecrire[x]); } catch (IOException e) { e.printStackTrace(); } } // Et on l'envoie try { os.write(baos.toByteArray()); } catch (IOException e) { e.printStackTrace(); } baos.reset(); } } //On envoie le dernier paquet // On remplit le tampon for(int x=0 ; x<compteur ; x++){ try { bos.write(aecrire[x]); } catch (IOException e) { e.printStackTrace(); } } //Et on l'envoie try { bos.flush(); os.write(baos.toByteArray()); os.flush(); } catch (IOException e) { e.printStackTrace(); } System.out.println("finished"); try { bos.close(); baos.close(); } catch (IOException e) { e.printStackTrace(); } return retour; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 FileOutputStream out = null; BufferedOutputStream outBuffer = null; try { out = new FileOutputStream(Configuration.getProperty("global.cheminDestinationVideo") + nomVideo); inBuffer = new BufferedInputStream(socket.getInputStream()); outBuffer = new BufferedOutputStream(out); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } while(enCours){ try { lu = inBuffer.read(); outBuffer.write(lu); } catch (IOException e) { return -1; } cptTailleFichier++; cptTailleGeneral++; if (cptTailleFichier%ratioFichier == 0){ /* le fichier courant vient de se terminer */ if (cptTailleFichier == tailleFichier){ /* on precise que la lecture du fichier est terminee */ enCours = false; } } } /* fermeture des flux */ try { outBuffer.flush(); outBuffer.close(); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); }
Partager