Socket

Résolu
Signaler
Messages postés
9
Date d'inscription
mardi 11 mai 2004
Statut
Membre
Dernière intervention
3 juin 2005
-
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
-
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).

Serveur:

import java.io.*;
import java.sql.*;
import java.net.*;
import java.util.Date;


public class Serveur2 {


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

import java.io.*;
import java.sql.*;
import java.util.Date;
import java.net.*;


public class Thread2 extends Thread{

private Socket connexion;
private int numero;

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();

}catch (IOException e){
System.err.println(e);}
}
}

8 réponses

Messages postés
9
Date d'inscription
mardi 11 mai 2004
Statut
Membre
Dernière intervention
3 juin 2005

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.

import javax.swing.*;
import java.io.*;
import java.net.*;
import java.util.StringTokenizer;


public class Client {
public static void main(String[] args) throws IOException {

int i = 0;
int bufferSize = 64 * 1024;
String machine = "83.196.133.104";

communication = new Socket(machine, 2001);


entrée = new BufferedReader(new InputStreamReader(communication.getInputStream()));
sortie = new PrintWriter(communication.getOutputStream(),true);

String [] lignesrecues = new String[2];
for(i=0;i<2;i++)
{
lignesrecues[i]=entrée.readLine();
System.out.println(lignesrecues[i]);
}

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;
}
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
je sias pas pour accelerer je regarderai en detail ;)
pour ce qui est de l'upload ya pas grand chose a changer car la boucle d'envoi reste la meme

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
492
Date d'inscription
jeudi 28 août 2003
Statut
Membre
Dernière intervention
25 avril 2007
5
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"...

Suggestions ?

'BriBus
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
si tu avais lu les ancien post tu verrai que g deja realise ce programme qui est en telechargemnt sur le site

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
http://www.javafr.com/code.aspx?id=29333

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
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"
Messages postés
492
Date d'inscription
jeudi 28 août 2003
Statut
Membre
Dernière intervention
25 avril 2007
5
right my friend... mais il fallait tester avant de l'affirmé... .
Voila qui est fait...

Bonne prog et bravo encore pour ce code sheoro.

'BriBus
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
lol merci

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"