bfranco8
Messages postés9Date d'inscriptionmardi 11 mai 2004StatutMembreDernière intervention 3 juin 2005
-
6 févr. 2005 à 15:43
sheorogath
Messages postés2448Date d'inscriptionsamedi 21 février 2004StatutModérateurDernière intervention29 janvier 2010
-
24 févr. 2005 à 19:40
Bonjour,
Je souhaite réaliser un transfert de fichiers entre un client et un serveur.
Je suis débutant dans ce langage. Je serais vraiment content si quelqu'un pouvait éclaircir ma lanternet.
But:
Un client transfert un fichier sur un serveur où réside une base de données de type access. Je ne sais
pas si une base de données peut contenir une image ou un fichier document. Je ne sais pas si il faut
travailler en mode binaire ou en mode caractère. Est il possible de récupérer le nom du fichier
transmis ???. Je ne sais pas si le client lancera son transfert à partir d'un applet ??. Bref, je sais pas beaucoup de choses!!!!.
Code:
Je vous transfert un petit code côté serveur que j'ai essayé de faire (pas terrible).
public static void main(String [] args) {
int i=0;
try{
//Montage d'un service rattaché au port 2001
ServerSocket service = new ServerSocket(2001);
while(true){
//attente de la connexion d'un client
Socket connexion = service.accept();
//Instanciation d'un objet de type thread
Thread2 firstthread = new Thread2(connexion,i);
//Démarrage du thread
firstthread.start();
}
//gestion des erreurs
}
catch (UnknownHostException e){
System.err.println("Pas de host :" + e);}
catch (IOException e){
System.err.println("Erreur" + e);}
}
}
Thread2(Socket connexion, int numero){
this.connexion=connexion;
this.numero=numero;
}
public void run(){
byte buffer[] = new byte[100];
try{
DataInputStream entrée = new DataInputStream(connexion.getInputStream());
DataOutputStream sortie = new DataOutputStream(connexion.getOutputStream());
int nLus = entrée.read(buffer);
while( nLus != -1 ){ // tant que non fin de fichier
for(int i=0;i<nLus; ++i){
System.out.print((char)(buffer[i]));
nLus = entrée.read(buffer);
}
}
entrée.close();
sortie.close();
connexion.close();
bfranco8
Messages postés9Date d'inscriptionmardi 11 mai 2004StatutMembreDernière intervention 3 juin 2005 6 févr. 2005 à 22:57
Re-bonjour,
J'ai repris ton programme. Je te transferts la partie cliente que j'ai réalisé. Je n'ai pas
encore terminé la partie serveur. Je n'ai pa pu tout tester. Je ne suis vraiment pas sure
de la partie en gras. Pourrais tu jeter un oeil. Pour tes problèmes de performances.
Je sais pas si ca peut t'aider.
Note:
Mon but est de uploader un fichier sur un serveur et non pas de
downloader à partir d'un serveur.
String nomdufichier = JOptionPane.showInputDialog("Entrez le nom du fichier à transmettre");
File source = new File(nomdufichier);
long taille = source.length();
sortie.println("Nom du fichier a recevoir " + nomdufichier + "\ntaille du fichier: "+ source.length());
sortie.println(nomdufichier);
sortie.println(taille);
BufferedOutputStream sortie2 = new BufferedOutputStream(communication.getOutputStream());
FileInputStream fichieraenvoyées = new FileInputStream(nomdufichier);
byte[] bufferdata = new byte[bufferSize];
System.out.println("Demarrage de la transmission du fichier");
for(i = 0; ; i++)
{
int len = fichieraenvoyées.read(bufferdata);
if(len < 0){
break;
}
sortie2.write(bufferdata, 0, len);
}
sortie2.flush();
System.out.println("\nfin du transfert");
}
public static BufferedReader entrée;
public static PrintWriter sortie;
public static Socket communication;
}
cs_AbriBus
Messages postés492Date d'inscriptionjeudi 28 août 2003StatutMembreDernière intervention25 avril 20075 18 févr. 2005 à 04:31
En fait, a bien y reflechir, je ne suis pas vraiment sur qu'il soit possible d'accelerer la vitesse de transfert... je m'explique:
Au debut je croyais qu'en ouvrant un autre socket pour initialiser un second transfert, la vitesse de transfert s'en trouverais augmentée (je n'esperais evidemment pas multiplier par deux mais gagner un peu quand meme), ce qui aurait été "relativement" facile, a condition qu'un socket commence par le debut et l'autre par la fin du fichier...
A bien y reflechier, je pense donc que le resultat obtenu ne serait pas dutout celui escompté. Lorsque j'ai fait des tests de vitesse en local, je me suis appercu que le "transfert" du fichier d'un port de mon ordinateur vers un autre port de mon ordinateur ne prenait probablement pas plus de temps que la COPIE du meme fichier par le systeme d'exploitation. J'en ai conclu qu'en l'occurence, la limite du taux de transfert n'etait pas un engorgement "logiciel" des données (qui aurait donc put se regler par l'ouverture d'une deuxieme voie de communication en effet) mais bel et bien au niveau materiel (probablement mon disque dur a en juger au faible taux d'utilisation de mes ressources durant le test).
Conclusion: Il serait probablement innutile de tenter d'ouvrir un deuxieme socket puisque je pense qu'il se partagerait le(s) facteur(s) limitants (Rapidité des opperations d'E/S, bande passante sur internet....) avec les second socket ainsi ouvert.
Concretement, je suis parvenu a cette conclusion en me posant la question "Pourquoi en serait-il autrement au regard des resultats du test decrit ci-dessus"...
sheorogath
Messages postés2448Date d'inscriptionsamedi 21 février 2004StatutModérateurDernière intervention29 janvier 201017 20 févr. 2005 à 21:02
je pense que dans le cas de figure que g coder les deux socket sont indispensable pour eviter une mauvaise ecriture de fichier (rappel toi de la foto)
apres les limitation de vitesse sont je pense obligatoirement lie au matos
car je ne voit pas pkoi un langage aurai de tel bridage
"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"