IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Sockets - client serveur


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club Avatar de Vinceee38
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 65
    Points
    65
    Par défaut Sockets - client serveur
    Bonjour à tous,

    Je dois réaliser un projet dans le cadre d'un cours d'architecture des SI mais je suis complétement largué alors j'espere que votre communauté pourra m'aider

    Je vous copie l'ennoncé pour que vous puissiez comprendre mon travail :

    Développez en java et en utilisant les sockets, une application client-serveur telle qu'un utilisateur, en utilisant la partie cliente, saisit la réservation d'un billet de train (dates, horaires, classe, destination, aller-retour etc.) Cette réservation est transmise à la partie serveur pour vérification de places suffisantes (on fait l'hypothèse que la destination et autres informations sont correctes et correspondent à des trains existants). S'il reste de la place dans le train, la réservation est confirmée, sinon, l'utilisateur est averti de la non satisfaction de la requête. Vous définirez le nombre de places disponibles pour chaque train.

    On utilisera l'API java.net pour l'utilisation des sockets.

    Que faut il regarder ?
    -Le nombre de clients connectés en meme temps.
    -Verrouillage/Deverouillage (type de gestion des accés concurrents)
    -2 pases COMIT (validation à deux phases)
    -...




    Nous avons vu en cours les architectures des SI et les relations client-serveur! Mais nous n'avons fait aucun cours de java relatif aux sockets ni quoi que ce soit...

    J'ai donc commencé en faisant des recherches sur la voile en cherchant un système client serveur en java et j'ai donc trouvé ceci:

    Classe ClientSocketTrain

    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
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.lang.ClassNotFoundException;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
     
    public class ClientSocketTrain {
        public static void main(String[] args) {
            try {
                //
                // Creer une connection avec le socket serveur sur l'application du serveur
                //
                InetAddress host = InetAddress.getLocalHost();
                Socket socket = new Socket(host.getHostName(), 7777);
     
                //
                // Envoie un message à l'application serveur (client à l'origine)
                //
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                oos.writeObject("test");
     
                //
                // Lit et affiche la réponse du message envoyé par l'application serveur
                //
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                String message = (String) ois.readObject();
                System.out.println("Message: " + message);
     
                ois.close();
                oos.close();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
    Classe ConnectionHandler:

    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
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.lang.ClassNotFoundException;
    import java.net.Socket;
     
    class ConnectionHandler implements Runnable {
        private Socket socket;
     
        public ConnectionHandler(Socket socket) {
            this.socket = socket;
     
            Thread t = new Thread(this);
            t.start();
        }
     
        public void run() {
            try
            {
                //
                // Lit le message envoyé par l'application client
            	//
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                String message = (String) ois.readObject();
     
                System.out.println("Message Recu: " + message);
     
     
     
                // 
                // Envoie une réponse à l'application cliente
                //
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                oos.writeObject("Bonjour...");
     
                ois.close();
                oos.close();
                socket.close();
     
                System.out.println("En attente d'un message du client...");
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
    Classe ServerSocketTrain:

    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
    import java.io.IOException;
    import java.net.Socket;
    import java.net.ServerSocket;
     
    public class ServerSocketTrain {
        private ServerSocket server;
        private int port = 7777;
     
        public ServerSocketTrain() {
            try {
                server = new ServerSocket(port);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
     
        public static void main(String[] args) {
            ServerSocketTrain example = new ServerSocketTrain();
            example.handleConnection();
        }
     
        public void handleConnection() {
            System.out.println("En attente du message du client...");
     
            //
            // Ici le serveur fait une boucle pour accepter toutes les connections engagées par
            // l'application cliente.
            //
            while (true) {
                try {
                    Socket socket = server.accept();
                    new ConnectionHandler(socket);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    Tout fonctionne pour le moment! En meme temps j'ai juste récupérer du code! Mais maintenant je ne sais vraiment pas par ou commencer... j'ai vraiment besoin de votre aide alors j'espere que vous allez rapidement me répondre pour que je puisse travailler dessus ! De plus notre professeur ne nous a donné que 5 jours de délai. Jusqu'à lundi prochain..

    Merci d'avance

  2. #2
    Membre régulier
    Homme Profil pro
    Ingénieur d'études J2EE
    Inscrit en
    Avril 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études J2EE

    Informations forums :
    Inscription : Avril 2009
    Messages : 82
    Points : 99
    Points
    99
    Par défaut
    Bonsoir,

    ce qu'il faut savoir, c'est que le package java.net te fournit 2 classes qui te seront très utiles :
    • Socket
    • ServerSocket


    Tu vas devoir créer 2 applications.
    • Une côté client, qui utilise un objet de la classe Socket
    • Et une côté server qui utilise un objet de la classe ServerSocket


    Commence par faire des recherches sur ces deux classes et renseigne-toi bien sur ce site. (exemple : http://gfx.developpez.com/tutoriel/java/network/)

    Pour faire simple, un socket est une route à double sens (un sens entrant appelé "inputStream" et un sens sortant appelé "outputStream").

    1°) Ton appli client collecte les informations de réservation
    2°) Elle envoie ces infos, via le outputStream de ton Socket à ton appli serveur
    3°) Ton appli serveur lit ses informations sur son inputStream
    4°) Il traite ses informations (vérification de places disponibles)
    5°) Il envoie la réponse, via le outputStream de ton ServerSocket à ton appli client
    6°) Ton appli client lit la réponse dans son inputStream et la traite

    Ce n'est pas très compliqué, tu verras. Allez, bon courage !

  3. #3
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut
    Alors dans un premier temps tu vas devoir creer un objet Train, un objet Billet et un objet Reservation. Pour commencer il vaut mieux faire assez simple, et etoffer après. Par exemple:

    La classe billet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Billet{
     private String nomDuClient;
     
     //constructeur de l'objet Billet
     public Billet(String nomDuClient){
      this.nomDuClient=nomDuClient;
     }
    }
    la classe Train
    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
     
    public class Train{
     private int idTrain;
     private String destination;
     private Billet[] tabBillet;
     
     //constructeur de Train
     public Train(int idTrain,String destination, int nbPlace){
      this.idTrain=idTrain;
      this.destination=destination;
      tabBillet=new Billet[nbPlace];
     }
     //Fonction pour ajouter un billet au train
     //elle retourne true si le billet est ajouté, sinon false.
     //elle est synchronized pour qu'un seul thread puisse l'utiliser en même temps
     public synchronized boolean ajouterBillet(Billet leBillet){
      for(int cpt=0;cpt<tabBillet.length;cpt++){
       if(tabBillet[cpt]==null){
        tabBillet[cpt]=leBillet;
        return true; 
       }
      }
      return false;
     }
     //Fonction pour afficher ton train
     public String afficherTrain(){
      int nbPlaceLibre=0;
      for(int cpt=0;cpt<tabBillet.length;cpt++){
       if(tabBillet==null){
        nbPlaceLibre=tabBillet.length-cpt;
        break;
       }
      }
      return "Train N°"+idTrain+",Destination: "+destination+", Nbre place dispo: "+nbPlaceLibre;
     }
    }
    Ta classe Reservation
    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
     
    public class Reservation implements Serializable{
     int idTrain;
     Billet leBillet;
     public Reservation(int idTain, String nomClient){
      this.idTrain=idTrain;
      this.leBillet=new Billet(nomClient);
     }
     //accesseurs
     public int getIdTrain(){
      return this.idTrain;
     }
     public Billet getBillet(){
      return leBillet;
     }
    }
    tuto pour la synchronisation:http://rom.developpez.com/java-synchronisation/
    A partir de là, sur ton serveur tu peux créer une liste de trains (3 ou 4 pour avoir un jeu d'essai un peu représentatif);
    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    private ArrayList<Train> listeTrain;
     
    listeTrain=new ArrayList<Train>();
    listeTrain.add(new Train(1,"Toulouse",20));
    listeTrain.add(new Train(2,"Rouen",10));
    listeTrain.add(new Train(3,"Montpellier",30));
    listeTrain.add(new Train(4,"Paris",50));
    Toujours sur ton serveur de socket il te faut une fonction pour envoyer un affichage de ta liste de trains
    + un accesseur sur ta liste de train
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public String[] afficherListeTrain(){
     String[] list=new String[listeTrain.size()];
     for(int cpt=0;cpt<listeTrain.size();cpt++){
      list[cpt]=listeTrain.get(cpt);
     }
     return list;
    }
    public ArrayList<Train> getListeTrain(){
     return listeTrain;
    }
    Et passer une reference sur du serverSocketTrain sur ConenctionHandler
    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
     
     //dans ServerSocketTrain
     while (true) {
                try {
                    Socket socket = server.accept();
                    new ConnectionHandler(socket,this);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
     //dans ConnectionHandler
     private Socket socket;
     private ServerSocketTrain serveur;
     private thread t;
     public ConnectionHandler(Socket socket, ServerSocketTrain serveur) {
      this.socket = socket;
      this.serveur=serveur;
      t = new Thread(this);
      t.start();
     }
     //petite modif sur ton run (finalement un grosse)
     public void run(){
      //on créé les moyen de communiquer avec le client
      ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
      ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
      //defacto on envoie la liste des trains au client
      //pas certain qu'on puisse directement envoyer un tableau de string 
      //mais on  va faire comme si
      oos.writeObject(serveur.afficherListeTrain());
      oos.flush();
      Object lecture;
      while(!socket.isClosed){
       lecture=ois.readObject();
       if(lecture instanceOf Reservation){
        int idTrain=(Reservation) lecture.getIdTrain();
        Train train=null;
        for(int cpt=0;cpt<serveur.getListeTrain().size();cpt++){
         if(serveur.getListeTrain().get(cpt).getIdTrain()==idTrain){
          train=serveur.getListeTrain.get(cpt);
          break;
         }
        }
        if(train!=null){
         boolean ajout=train.ajouterBillet((Reservation)lecture.getBillet());
         oos.writeBoolean(ajout);
         oos.flush;
         t.sleep(100);
         oos.writeObject(serveur.afficherListeTrain());
         oos.flush;
        }
       } 
      }
      oos.close();
      ois.close();
     }
    Avec ca tu as les grande lignes du serveur (va falloir certainement ajuste et corriger certaines chose);
    Avant de se connecter au serveur, le client devra saisir sont nom.
    Qd ton client va se connecter, il faut qu'il interprete la liste des trains (un String[]) et l'afficher.
    Ton utilisateur devra choisir un train (en saisissant l'idTrain du train par exemple);
    Ton client créé un objet Reservation en fonction du idTrain choisi et du nom client;
    La reservation est envoyé au serveur;
    Le serveur repond pas true ou false pour valider la reservation.
    -Le nombre de clients connectés en meme temps.
    Au niveau de ton serveur de socket tu peux imlpementer un variable static "nbClient" initialiser a 0. A chaque fois que tu accepte une connection tu l'incremente de 1, et tu la décremente de 1 lors de la deconnection.
    Pour ça, l'ideal est de passer par des fonctions synchronisées etant donné que tu va faire du multiThreading.

    Bon y a vraiment les grandes lignes, va certainement te faloir un peu de boulot pour que ca marche (l'utilisation d'un IDE c'est qd meme mieux: voir eclipse).. bonne chance
    La javaDoc est mon amie, elle est la tienne aussi!

  4. #4
    Membre du Club Avatar de Vinceee38
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 65
    Points
    65
    Par défaut
    Waouu merci beaucoup pour vos réponses, je vais regarder ca de tres pres , j'ai deux heures pour le faire. Je vous tiens au courant mais je pense pouvoir deja enormement avancer avec ce que vous m'avez fourni. Merci beaucoup c'est super

  5. #5
    Membre du Club Avatar de Vinceee38
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 65
    Points
    65
    Par défaut
    Voila ou j'en suis :

    Je lance l'application serveur qui elle s'execute correctement et m'affiche le message: en attente du message client...

    Seulement voila quand j'execute le coté client voila l'erreur qui s'affiche du coté serveur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    java.io.EOFException
    	at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
    	at java.io.ObjectInputStream.readObject0(Unknown Source)
    	at java.io.ObjectInputStream.readObject(Unknown Source)
    	at ConnectionHandler.run(ConnectionHandler.java:34)
    	at java.lang.Thread.run(Unknown Source)
    et voici le message qui m'est retourné du coté client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Message: [Ljava.lang.String;@a90653
    Est ce que vous auriez une idée sur cette erreur que je n'arrive pas à comprendre! Pourtant j'ai cherché sur le net

    Merci d'avance

  6. #6
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut
    Tu as un problème de End of File (c'est bien la premiere fois que je la vois celle là)... sans code ca va etre difficile de t'aider.
    Pense aussi que tu a la javadoc qui te permet de "décoder" les exceptions et optionnellement aussi de connaitre un peu mieux les objets que tu manipule
    (suffit de cliquer sur le lien de ma signature)
    La javaDoc est mon amie, elle est la tienne aussi!

  7. #7
    Membre du Club Avatar de Vinceee38
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 65
    Points
    65
    Par défaut
    Merci beaucoup pour ta réponse vraiment trés rapide !

    J'ai essayé de me renseigner sur diverses recherches et j'ai trouvé quelques trucs disant que j'executais soit disant le thread trop tot.

    Je ne vois pas vraiment ! Je pensais mettre un sleep mais apparement ca ne marche pas !

    Je laisse le code de ma classe serveur peut etre que tu pourra m'aider un peu plus facilement :

    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
    import java.io.IOException;
    import java.net.Socket;
    import java.net.ServerSocket;
    import java.util.ArrayList;
     
    public class ServerSocketTrain {
        private ServerSocket server;
        private int port = 8765;
        private ArrayList<Train> listeTrain;
     
     
        public ServerSocketTrain() {
            try {
                server = new ServerSocket(port);
                listeTrain=new ArrayList<Train>();
                listeTrain.add(new Train(1,"Toulouse",20));
                listeTrain.add(new Train(2,"Rouen",10));
                listeTrain.add(new Train(3,"Montpellier",30));
                listeTrain.add(new Train(4,"Paris",50));
     
     
            } 	catch (IOException e) {
                e.printStackTrace();
            }
     
        }
     
        public static void main(String[] args) {
            ServerSocketTrain example = new ServerSocketTrain();
            example.handleConnection();
        }
     
        public void handleConnection() {
            System.out.println("En attente du message du client...");
     
            //
            // Ici le serveur fait une boucle pour accepter toutes les connections engagées par
            // l'application cliente.
            //
            while (true) {
                try {
                    Socket socket = server.accept();
                    new ConnectionHandler(socket, this);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
     
        public String[] afficherListeTrain(){
        	String[] list=new String[listeTrain.size()];
        	for(int cpt=0;cpt<listeTrain.size();cpt++){
     
        		list[cpt]= listeTrain.get(cpt).toString();
        	}
        	return list;
        }
     
        public ArrayList<Train> getListeTrain(){
        	return listeTrain;
        }
     
     
    }
    Merciiiiiiiiiiiiiiiiiiiii

  8. #8
    Membre du Club Avatar de Vinceee38
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 65
    Points
    65
    Par défaut
    Ah oui et la classe 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
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.lang.ClassNotFoundException;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
     
    public class ClientSocketTrain {
        public static void main(String[] args) {
            try {
                //
                // Creer une connection avec le socket serveur sur l'application du serveur
                //
                InetAddress host = InetAddress.getLocalHost();
                Socket socket = new Socket(host.getHostName(), 8765);
     
                //
                // Envoie un message à l'application serveur (client à l'origine)
                //
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                oos.writeObject("test");
     
                //
                // Lit et affiche la réponse du message envoyé par l'application serveur
                //
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                String message = ois.readObject().toString();
                System.out.println("Message: " + message);
     
                ois.close();
                oos.flush();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            	catch (ClassCastException e) {
                e.printStackTrace();
            }
        }
    }
    J'ai remarqué que quand je supprimais les ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                oos.writeObject("test");
    et le oos.flush() qui va avec, alors l'erreur n'apparait plus mais dans ce cas le programme ne fonctionne pas ! Le serveur ne recoit pas de message, et tout ce qu'on tappe du coté client ne sert a rien , et on ne recoit rien du coté client non plus

  9. #9
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut
    Le code cote client ca donne quoi?
    La javaDoc est mon amie, elle est la tienne aussi!

  10. #10
    Membre du Club Avatar de Vinceee38
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 65
    Points
    65
    Par défaut
    Je l'ai mi un peu plus haut :/ Désolé j'ai été un peu lent

  11. #11
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     String message = ois.readObject().toString();
    Te renvoi l'adresse memoire, normal car il lit un objet de type Object.
    Si, comme dans mon exemple, tu renvoi un tableau de String il faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Object message= ois.readObject();
    if(message instanceOf String[]){
     String[] tableString=(String[])message;
    }
    //et ensuite passer ca dans une boucle
    for(int cpt=0;cpt<tableString.length;cpt++){
     System.out.(tableString[cpt]);
    }
    Si tu renvoi à la connection un String (genre: "vous etes connecté"), alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Object message=ois.readObject();
    if(message instanceOf String){
     System.out.println((String)message);
    }
    Essaye de flush oos apres avoir fait ton writeObject("test");

    De plus tu as oublié de fermer oos et socket.

    Vois si ca resoud pas le souci
    La javaDoc est mon amie, elle est la tienne aussi!

  12. #12
    Membre du Club Avatar de Vinceee38
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 65
    Points
    65
    Par défaut
    Merci beaucoup , j'ai remplacé mon code en suivant tes conseils, en revanche il y a une chose que ne comprend pas c'est dans ServerSocketTrain :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            public String[] afficherListeTrain(){
        	String[] list=new String[listeTrain.size()];
        	for(int cpt=0;cpt<listeTrain.size();cpt++){
        		list[cpt]= listeTrain.get(cpt).toString();
        	}
        	return list;
        }
    Si je ne met pas le toString() alors j'ai une erreur:

    Type mismatch: cannot convert from Train to String

    Je vais essayer de comprend merci beaucoup

    Meme quand j'essaye de le "caster" il n'y a rien à faire cela ne veux pas

  13. #13
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut
    Citation Envoyé par Vinceee38 Voir le message
    Merci bcp , j'ai remplacé mon code en suivant tes conseils, en revanche il y a une chose que ne comprend pas c'est dans ServerSocketTrain :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            public String[] afficherListeTrain(){
        	String[] list=new String[listeTrain.size()];
        	for(int cpt=0;cpt<listeTrain.size();cpt++){
        		list[cpt]= listeTrain.get(cpt).toString();
        	}
        	return list;
        }
    Si je ne met pas le toString() alors j'ai une erreur:

    Type mismatch: cannot convert from Train to String

    Je vais essayer de comprend merci bcp
    Normal, j'ai fait une boulette
    en fait ce qu'il faudrai faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public String[] afficherListeTrain(){
     String[] list=new String[listeTrain.size()];
     for(int cpt=0;cpt<listeTrain.size();cpt++){
      list[cpt]= listeTrain.get(cpt).afficherTrain();
     }
     return list;
    }
    En fait là, listeTrain.get(cpt) te renvoi un objet de type Train. Pour l'afficher correctement, il faut appeler la methode afficherTrain() de ton instance de Train.
    Par contre, le toString va bien renvoyer un String... mais c'est la reference (ou adresse memoire) de cette instance de Train qu'il va te renvoyer

    je t'invite à regarder dans la classe Object la methode toString(), vu que toute les classes héritent de la classe Object (si je dis pas de bêtise ).
    La javadoc c'est vraiment incontournable si tu veux développer
    La javaDoc est mon amie, elle est la tienne aussi!

  14. #14
    Membre du Club Avatar de Vinceee38
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 65
    Points
    65
    Par défaut
    Hihi merci ca marche puis j'ai meme compris pour l'histoire du toString()

    Effectivement c'est mieux en appellant la méthode ! Par contre l'erreur EOFExecption persiste

    Voici à quoi ressemble mes deux classes mnt:

    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
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.lang.ClassNotFoundException;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
     
    public class ClientSocketTrain {
        public static void main(String[] args) {
            try {
                //
                // Creer une connection avec le socket serveur sur l'application du serveur
                //
                InetAddress host = InetAddress.getLocalHost();
                Socket socket = new Socket(host.getHostName(), 8765);
     
                //
                // Envoie un message à l'application serveur (client à l'origine)
                //
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                oos.writeObject("test");
                oos.flush();
     
                //
                // Lit et affiche la réponse du message envoyé par l'application serveur
                //
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                Object message= ois.readObject();
                String[] tableString = null;
                if(message instanceof String[]){
                 tableString=(String[])message;
                }
                //et ensuite passer ca dans une boucle
                for(int cpt=0;cpt< tableString.length;cpt++){
                 System.out.println(tableString[cpt]);
                }
     
                System.out.println("Message: " + message);
     
                ois.close();
                oos.flush();
                socket.close();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            	catch (ClassCastException e) {
                e.printStackTrace();
            }
        }
    }
    serveur:

    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
    import java.io.IOException;
    import java.net.Socket;
    import java.net.ServerSocket;
    import java.util.ArrayList;
     
    public class ServerSocketTrain {
        private ServerSocket server;
        private int port = 8765;
        private ArrayList<Train> listeTrain;
     
     
        public ServerSocketTrain() {
            try {
                server = new ServerSocket(port);
                listeTrain=new ArrayList<Train>();
                listeTrain.add(new Train(1,"Toulouse",20));
                listeTrain.add(new Train(2,"Rouen",10));
                listeTrain.add(new Train(3,"Montpellier",30));
                listeTrain.add(new Train(4,"Paris",50));
     
     
            } 	catch (IOException e) {
                e.printStackTrace();
            }
     
        }
     
        public static void main(String[] args) {
            ServerSocketTrain example = new ServerSocketTrain();
            example.handleConnection();
        }
     
        public void handleConnection() {
            System.out.println("En attente du message du client...");
     
            //
            // Ici le serveur fait une boucle pour accepter toutes les connections engagées par
            // l'application cliente.
            //
            while (true) {
                try {
                    Socket socket = server.accept();
                    new ConnectionHandler(socket, this);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
     
        public String[] afficherListeTrain(){
        	 String[] list=new String[listeTrain.size()];
        	 for(int cpt=0;cpt<listeTrain.size();cpt++){
        	  list[cpt]= listeTrain.get(cpt).afficherTrain();
        	 }
        	 return list;
        	}
     
     
        public ArrayList<Train> getListeTrain(){
        	return listeTrain;
        }
     
     
    }
    Je suis embetant je sais mais tu es mon seul espoir

    merci encore

  15. #15
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut
    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
     
    public class ClientSocketTrain {
     public static void main(String[] args) {
      try {
    // Creer une connection avec le socket serveur sur l'application du serveur
       InetAddress host = InetAddress.getLocalHost();
       Socket socket = new Socket(host.getHostName(), 8765);
    // Envoie un message à l'application serveur (client à l'origine)
       ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
       oos.writeObject("test");
       oos.flush();
    // Lit et affiche la réponse du message envoyé par l'application serveur
       ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
       Object message= ois.readObject();
       String[] tableString = null;
       if(message instanceof String[]){
        tableString=(String[])message;
       }
    //et ensuite passer ca dans une boucle
       for(int cpt=0;cpt< tableString.length;cpt++){
         System.out.println(tableString[cpt]);
       }
    // assez inutile, tu affiche l'adresse mémoire de message
       System.out.println("Message: " + message);
      } catch (UnknownHostException e) {
       e.printStackTrace();
      } catch (IOException e) {
       e.printStackTrace();
      } catch (ClassNotFoundException e) {
       e.printStackTrace();
      }catch (ClassCastException e) {
       e.printStackTrace();
    //Block finally pour s'assurer que tout est bien fermé
      }finally{
       try{
        oos.close();
        ois.close();
        socket.close();
        }catch(IOException ioe){
         ioe.printStackTrace();
        }
      }
     }
    }
    En ce qui concerne la EOFException, ca indique que tu as atteind la fin de la lecture. Avec ce code, as-tu la liste des trains qui s'affiche coté client?
    Edit: renvoi l'integralité du message d'erreur
    La javaDoc est mon amie, elle est la tienne aussi!

  16. #16
    Membre du Club Avatar de Vinceee38
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 65
    Points
    65
    Par défaut
    Merci merci !

    Donc deja avant d'executer le code cela me met une erreur sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        oos.close();
        ois.close();
        socket.close();
    Il me dit pour chacun qu'il ne peut pas etre resolved.

    J'ai donc enlevé le try catch qui concernait ce bout de code et j'ai executé pour voir !

    Du coté client cela affiche ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Train N°1,Destination: Toulouse, Nbre place dispo: 0
    Train N°2,Destination: Rouen, Nbre place dispo: 0
    Train N°3,Destination: Montpellier, Nbre place dispo: 0
    Train N°4,Destination: Paris, Nbre place dispo: 0
    Message: [Ljava.lang.String;@de6ced
    Ca marche du coté client mais la place dispo est à 0 et le message est toujours "bisar" (le code memoire quoi)lol

    Sinon coté serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    En attente du message du client...
    java.net.SocketException: Connection reset
    	at java.net.SocketInputStream.read(Unknown Source)
    	at java.net.SocketInputStream.read(Unknown Source)
    	at java.io.ObjectInputStream$PeekInputStream.peek(Unknown Source)
    	at java.io.ObjectInputStream$BlockDataInputStream.peek(Unknown Source)
    	at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
    	at java.io.ObjectInputStream.readObject0(Unknown Source)
    	at java.io.ObjectInputStream.readObject(Unknown Source)
    	at ConnectionHandler.run(ConnectionHandler.java:34)
    	at java.lang.Thread.run(Unknown Source)
    Peut etre l'erreur est due au bout de code que j'ai enlevé comme je l'explique plus haut !

  17. #17
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut
    Arf je me suis fais avoir comme une bleusaille
    J'ai pas tenu compte de la portée des variables:

    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
     
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
     
    public class ClientSocketTrain {
     
     public static void main(String[] args) {
     ObjectOutputStream oos=null;
     ObjectInputStream ois=null;
     Socket socket=null;
      try {
    // Creer une connection avec le socket serveur sur l'application du serveur
    // A propos ça marche uniquement si les 2 appli tourne sur le meme poste.
       InetAddress host = InetAddress.getLocalHost();
       socket = new Socket(host.getHostName(), 8765);
    // Envoie un message à l'application serveur (client à l'origine)
       oos = new ObjectOutputStream(socket.getOutputStream());
       oos.writeObject("test");
       oos.flush();
    // Lit et affiche la réponse du message envoyé par l'application serveur
       ois = new ObjectInputStream(socket.getInputStream());
       Object message= ois.readObject();
       String[] tableString = null;
       if(message instanceof String[]){
        tableString=(String[])message;
       }
    //et ensuite passer ca dans une boucle
       for(int cpt=0;cpt< tableString.length;cpt++){
         System.out.println(tableString[cpt]);
       }
    // assez inutile, tu affiche l'adresse mémoire de message
       System.out.println("Message: " + message);
      } catch (UnknownHostException e) {
       e.printStackTrace();
      } catch (IOException e) {
       e.printStackTrace();
      } catch (ClassNotFoundException e) {
       e.printStackTrace();
      }catch (ClassCastException e) {
       e.printStackTrace();
    //Block finally pour s'assurer que tout est bien fermé
      }finally{
       try{
        oos.close();
        ois.close();
        socket.close();
        }catch(IOException ioe){
         ioe.printStackTrace();
        }
      }
     }
    }
    La socket exception est normal, tu ferme le socket, donc le serveur le signale. C'est géré comme ça.

    Pour lire le String "test", il faut faire comme sur le client mais dans ton connectionhandler (un peu comme pour lire une reservation cf plus haut)

    Bon et bien... moi j'ai fini ma journée, bonne chance pour la suite
    La javaDoc est mon amie, elle est la tienne aussi!

  18. #18
    Membre du Club Avatar de Vinceee38
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par Torg666 Voir le message
    Arf je me suis fais avoir comme une bleusaille
    J'ai pas tenu compte de la portée des variables:

    La socket exception est normal, tu ferme le socket, donc le serveur le signale. C'est géré comme ça.

    Pour lire le String "test", il faut faire comme sur le client mais dans ton connectionhandler (un peu comme pour lire une reservation cf plus haut)

    Bon et bien... moi j'ai fini ma journée, bonne chance pour la suite
    Merci beaucoup pour m'avoir aidé autant que ca ! Je ne sais pas comment te remercier! Bonne fin de soirée à toi

    Si quelqu'un d'autre passe par la , du coté client je n'ai plus d'erreur mais du coté serveur j'ai de nouveau l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    En attente du message du client...
    java.io.EOFException
    	at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
    	at java.io.ObjectInputStream.readObject0(Unknown Source)
    	at java.io.ObjectInputStream.readObject(Unknown Source)
    	at ConnectionHandler.run(ConnectionHandler.java:34)
    	at java.lang.Thread.run(Unknown Source)
    Besoin d'aide.

  19. #19
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut
    Sur afficherTrain, il y a aussi un oubli (désolé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //Fonction pour afficher ton train
     public String afficherTrain(){
      int nbPlaceLibre=0;
      for(int cpt=0;cpt<tabBillet.length;cpt++){
    //ici il faut verifier que l'element du tableau est null
       if(tabBillet[cpt]==null){
        nbPlaceLibre=tabBillet.length-cpt;
        break;
       }
      }
      return "Train N°"+idTrain+",Destination: "+destination+", Nbre place dispo: "+nbPlaceLibre;
     }
    Pour EOFException je vois pas par contre...
    Arrive-tu as lire le "test" coté serveur?
    La javaDoc est mon amie, elle est la tienne aussi!

  20. #20
    Membre du Club Avatar de Vinceee38
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par Torg666 Voir le message
    Sur afficherTrain, il y a aussi un oubli (dsl):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //Fonction pour afficher ton train
     public String afficherTrain(){
      int nbPlaceLibre=0;
      for(int cpt=0;cpt<tabBillet.length;cpt++){
    //ici il faut verifier que l'element du tableau est null
       if(tabBillet[cpt]==null){
        nbPlaceLibre=tabBillet.length-cpt;
        break;
       }
      }
      return "Train N°"+idTrain+",Destination: "+destination+", Nbre place dispo: "+nbPlaceLibre;
     }
    Pour EOFException je vois pas par contre...
    Arrive-tu as lire le "test" coté serveur?
    Merci encore pour ton aide!
    J'ai corrigé la methode afficherTrain qui affiche bien le nombre de places maintenant mais il y a toujours les memes erreurs:

    coté client ca va:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Train N°1,Destination: Toulouse, Nbre place dispo: 20
    Train N°2,Destination: Rouen, Nbre place dispo: 10
    Train N°3,Destination: Montpellier, Nbre place dispo: 30
    Train N°4,Destination: Paris, Nbre place dispo: 50
    Message: [Ljava.lang.String;@a90653
    coté serveur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    En attente du message du client...
    java.io.EOFException
    	at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
    	at java.io.ObjectInputStream.readObject0(Unknown Source)
    	at java.io.ObjectInputStream.readObject(Unknown Source)
    	at ConnectionHandler.run(ConnectionHandler.java:34)
    	at java.lang.Thread.run(Unknown Source)
    Il n'apparait pas le message "test"

    J'ai peut etre fait une erreur ailleur...je ne sais pas

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Socket client serveur
    Par ppphil dans le forum C#
    Réponses: 1
    Dernier message: 08/09/2007, 10h57
  2. [C] Probleme avec socket client-serveur TCP
    Par LinuxUser dans le forum Réseau
    Réponses: 33
    Dernier message: 15/05/2007, 22h26
  3. [socket] client/serveur multi-thred
    Par iag_1980 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 03/03/2007, 15h38
  4. socket client serveur
    Par idino dans le forum Réseau
    Réponses: 3
    Dernier message: 29/01/2007, 14h45
  5. Socket client serveur
    Par rhdjml dans le forum Langage
    Réponses: 2
    Dernier message: 08/03/2006, 12h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo