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

Java Discussion :

Serveur pour clients de natures différentes


Sujet :

Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 15
    Points : 8
    Points
    8
    Par défaut Serveur pour clients de natures différentes
    Bonsoir,

    j'aimerais créer un serveur en java. Cependant je n'arrive pas à comprendre comment créer un serveur qui puisse gérer plusieurs clients, mais de nature différente. C'est-à-dire que le serveur ne se comporte pas de la même façon en fonction d'eux.

    J'ai 2 clients possibles dans mon système :
    - 1 arduino (avec modem gsm)
    - 1 smartphone android.

    L'android se connecte en premier au serveur. Le serveur créer donc un thread associé au socket de ce client.
    Lorsque l'arduino se connecte, le serveur dois aussi lui créer un socket. Mais le traitement dois être différent. J'aimerais comprendre comment cibler selon mon choix l'arduino, ou bien l'android. C'est-à-dire, à certain moment j'aimerais pouvoir envoyer un message à arduino seulement. Il s'agit donc de pouvoir les différentier. Et ce, en gardant tout le monde connecté.

    Merci d'avance pour vos réponses, en espérant avoir été clair

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    si ton problème est de savoir qui est derrière la socket, il suffit que dans ton protocole tu prévois un premier échange qui est l'identification par un login, ou par une simple string donnant le nom de l'appareil. Après tu peux classer tes sockets comme tu le veux.

  3. #3
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Tu peux également choisir d'ecouter 2 ports différents pour chacun.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    si ton problème est de savoir qui est derrière la socket, il suffit que dans ton protocole tu prévois un premier échange qui est l'identification par un login, ou par une simple string donnant le nom de l'appareil. Après tu peux classer tes sockets comme tu le veux.
    Salut!
    En fait pour identifier les deux clients, lors de leurs connexion, ils envoient un message particulier (un string) et selon le message reçu, le serveur effectue deux choses différentes. Mais le problème c'est que le server est en attente d'un message bien particulier de l'arduino, quand ce deernier envoie ce message là, le server envoie un message bien précis à l'application et puis continue à communiquer avec l'arduino. Notre code reçoit bien l'information de l'arduino, répond à l'application, et continue à envoyer les bonnes informations MAIS cette fois-ci à l'application et pas à l'arduino.

    Exemple:
    L'arduino se connecte et envoie "arduino", l'application se connecte et envoie "application". Soit response la variable String qui contiendra le mot reçu. Soit Nom la variable de laquelle va dépendre la communication avec l'application.

    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
    //variable globale
    public String Nom = "default";
    
    
    if(response.equals("arduino"))
    {
    //code à executer
    // et envoie d'informations à l'arduino en continue sans arrêt dans une boucle
    // et en ayant des réponses de l'arduino la variable Nom pprendra une valeur précise comme "lannister" par exemple
    //cette boucle continuera à s'executer et à envoyer les informations à l'arduino
    }
    else if(response.equals("application"))
    {
    while(Nom.equals("default")
    {
    //tourne dans le vide
    }
    //envoie d'une seule information à l'appli quand il sors de la boucle et quand la variable prendra la valeur "lannister"
    //puis il est censé continuer à envoyer les autres infos à l'arduino
    }
    le gros problème c'est qu'on arrive pas à gérer à qui il doit répondre. Le serveur répond tout le temps qu'au dernier client connecté.

    J'espère que c'était clair.. merci d'avance

  5. #5
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Mouais, ca ressemble à un probleme de thread ou bien de variable globale. Il faudrait nous montrer le code ou tu recuperes le stream des sockets application et comment tu y envoies tes données.
    Mais à vue de boule de cristal, je dirais que tu as utilisé une variable globale pour le stream application et que tu la remplaces à chaque connexion. Ce qu'il faudrait faire, c'est gerer une List de stream et, lorsque tu veux envoyer des infos, iterer ta liste et envoyer la sauce à chacun.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Voila le 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
    65
    public class Server {
     
       private int port = 2345;
       private String host = "192.168.0.11";
       private ServerSocket server = null;
       private static boolean isRunning = true;
       private Socket connexion = null;
     
       public Server(){
          try {
             server = new ServerSocket(port, 100, InetAddress.getByName(host));
          } catch (UnknownHostException e) {
             e.printStackTrace();
          } catch (IOException e) {
             e.printStackTrace();
          }
       }
     
       public Server(String pHost, int pPort){
          host = pHost;
          port = pPort;
          try {
             server = new ServerSocket(port, 100, InetAddress.getByName(host));
          } catch (UnknownHostException e) {
             e.printStackTrace();
          } catch (IOException e) {
             e.printStackTrace();
          }
       }
     
     
       public void open(){
     
          Thread t = new Thread(new Runnable(){
             public void run(){
                while(isRunning == true){
     
                   try {
                      System.err.println("attente d'une connexion cliente "+ ClientManaging.compteur);
                      Socket client = server.accept();
                      System.out.println(client.getLocalPort());
                      ClientManaging.compteur++;
                      System.out.println("Connexion cliente reçue "+ClientManaging.compteur);
                      Thread t = new Thread(new ClientManaging(client));
                      t.start();
                   } catch (IOException e) {
                      e.printStackTrace();
                   }
                }
     
                try {
                   server.close();
                } catch (IOException e) {
                   e.printStackTrace();
                   server = null;
                }
             }
          });
          t.start();
       }
     
       public static void close(){
          isRunning = false;
       }
    }
    Et le fichier client managing qui est censé gérer les deux clients


    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
    public class ClientManaging implements Runnable{
     
       private static Socket sock;
       private static PrintWriter writer = null;
       private BufferedInputStream reader = null;
       public static String Nom = "default";
       public static String Id = "default";
       public static int compteur = 0;     
       public static int var = 0; 
     
       public ClientManaging(Socket pSock){
          sock = pSock;
       }
     
       public void run(){
          System.out.println("Lancement du traitement de la connexion cliente " + compteur);
     
          boolean closeConnexion = false;
          while(!sock.isClosed()){
     
             try {
                writer = new PrintWriter(sock.getOutputStream());
                reader = new BufferedInputStream(sock.getInputStream());
     
                //On attend la demande du client 
                String response = read();
     
                InetSocketAddress remote = (InetSocketAddress)sock.getRemoteSocketAddress();
                if(response.length() > 7) //ici on traite les demandes de l'arduino
                {
     
    //c'est des conditions qui dependent de notre code, ne pas trop tenir compte
                    System.out.println("NEW COMMAND RECIEVED: "+response.substring(0, response.indexOf("-")));
                    if(response.substring(0, response.indexOf("-")).equals("passages") || 
                        response.substring(0, response.indexOf("-")).equals("gps") || 
                        response.substring(0, response.indexOf("-")).equals("nomcourtligne")){
                    try {
                        if(response.substring(0, response.indexOf("-")).equals("nomcourtligne")){
                        System.out.println("response = " + response + "length de ersponse = " + response.length());
                        System.out.println("length de c4= " + response.substring(response.lastIndexOf("-")+1).length());
                        System.out.println("length de c4 coupé :" + response.substring(response.lastIndexOf("-") + 1, response.indexOf("4")+1).length());
                        }
                        Breyes.star(response);
                    } catch (MalformedURLException ex) {
                        Logger.getLogger(ClientProcessor.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(ClientProcessor.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    }
                        //sock.close();  
                }
                else //on traite la demande de l'application
                {
                    System.out.println("nom = " + Nom + " id = " + Id);
                    while(Nom.equals("default"))
                    {
                        System.err.println("en attente du nom");
                        Nom = Breyes.Name; //ici on prend la valeur de la variable globale dans une autre classe quand elle change on sort de la boucle et on envoie l'info
                        Id = Breyes.idbus;
                    }
                    if(response.substring(0,response.indexOf(".")).equals(Id))
                    {
                        //c'est ici qu'on répond à l'appli
                        writer.write(Nom);
                        writer.flush();
                        //sock.close(); 
                    }
                    else
                    {
                        writer.write("Aucun zombie a l'arret");
                        writer.flush();
                        sock.close();
                    }
                    }
                }catch(SocketException e){
                    System.err.println("LA CONNEXION A ETE INTERROMPUE ! ");
                    break;
                } catch (IOException e) {
                    e.printStackTrace();
                }         
            }
       }
     
       //La méthode que nous utilisons pour lire les réponses
       private String read() throws IOException{      
          String response = "";
          int stream;
          byte[] b = new byte[4096];
          System.out.println("YOUHOU YOUHOU YOUHOU");
          stream = reader.read(b);
          response = new String(b, 0, stream);
          return response;
       }
     
    //cette fonction qui suit envoit sans arrêt dans une boucle le temps à l'arduino, dès que l'appli se connecte et fait une demande on répond à l'appli, et on continue à executer cette fonction, mais en répondant à l'appli alors que ca doit etre à l'arduino
       public static void envoi_temps(String temps) throws IOException{
           System.out.println("envoi temps: "+temps);
           writer = new PrintWriter(sock.getOutputStream());
           writer.write(temps);
           writer.flush();
    }
    }

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ouais, ben voilà, tu va commencer par retirer tout ces méchants static dans tes classes client et server, pui revenir nous voir après si ton problème persiste

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    ouais, ben voilà, tu va commencer par retirer tout ces méchants static dans tes classes client et server, pui revenir nous voir après si ton problème persiste
    Oui j'ai essayé de l'enlever, mais puisque j'ai partout de static, il me dit "non-static method cannot be referenced from a static context".
    Alors que j'ai enlevé tous les static de la classe dans laquelle je fais appel à la méthode, je comprends pas comment régler ce problème je tourne en rond..

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par iMadz1993 Voir le message
    Oui j'ai essayé de l'enlever, mais puisque j'ai partout de static, il me dit "non-static method cannot be referenced from a static context".
    Alors que j'ai enlevé tous les static de la classe dans laquelle je fais appel à la méthode, je comprends pas comment régler ce problème je tourne en rond..
    Ben tu retire aussi les static de tes méthodes.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Ben tu retire aussi les static de tes méthodes.
    Oui je les ai retiré mais j'ai toujours des problèmes de static, il faudrait que je crée des instances non ?
    Parce que je l'avais pas fait!

  11. #11
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Il semblerait que ma boule de cristal ait vu juste

    Ta classe ClientManaging contient un PrintWriter writer et un BufferedInputStream reader. Ca suppose bien qu'elle est sensée gerer une connexion par instance. En utilisant des variables static, tu remplaces tes streams à chaque connexion.

    Ce qu'il faut faire, c'est virer les static comme cela t'a deja ete dit et creer une instance de ClientManaging à chaque connexion.

Discussions similaires

  1. progrmmer en java pour client serveur
    Par wang_xue dans le forum Langage
    Réponses: 1
    Dernier message: 31/10/2007, 13h37
  2. Réponses: 2
    Dernier message: 14/05/2007, 22h35
  3. Réponses: 2
    Dernier message: 15/03/2007, 16h34
  4. [Indy] Client-serveur pour recevoir des flux videos
    Par Nicodemus dans le forum Web & réseau
    Réponses: 7
    Dernier message: 10/10/2005, 14h18
  5. Réponses: 2
    Dernier message: 01/08/2005, 16h55

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