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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé 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
    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 confirmé
    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
    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 expérimenté Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    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

  4. #4
    Membre confirmé 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
    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 confirmé 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
    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 expérimenté Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    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)

+ Répondre à la discussion
Cette discussion est résolue.

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