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

avec Java Discussion :

communication entre serveur et client ?


Sujet :

avec Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut communication entre serveur et client ?
    bonjour,

    je pense avoir réussi à faire que mon client se connecte à mon serveur, mais je n'ai pas réussi à transmettre un message de l'un à l'autre ou inversement.

    j'utilise un thread pour lancer mon serveur avec ça:
    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
     
    try
            {
     
                //System.out.println("Server Up !");
                ServerSocket serverS = new ServerSocket(4444); //server
     
                Socket clientS = new Socket(); //client that should connect instance
                System.out.println("Server Up ! Waiting for a client...");
                //System.out.println("Le nom du thread principal est " + Thread.currentThread().getName());
                clientS = serverS.accept(); //listen
     
     
                PrintWriter out = new PrintWriter(clientS.getOutputStream(), true);  //write to client
     
                BufferedReader in = new BufferedReader(new InputStreamReader(clientS.getInputStream())); //read from client
     
                while(in.readLine()!=null)   //read string from client 
                {  
                    in.readLine();
                }
            }
            catch (IOException e)
            {
                System.err.println("erreur.");
                System.exit(1);
            }
    et mon 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
     
    try
            {      
                Socket clientS = new Socket("127.0.0.1", 4444);
                PrintWriter out = new PrintWriter(clientS.getOutputStream(), true);
                BufferedReader in = new BufferedReader(new InputStreamReader(clientS.getInputStream()));
                System.out.println("Client Started");
                while (clientS != null)
                {
     
                    out.println("check");
                }
     
            } 
            catch (UnknownHostException e) 
            {
                System.err.println("Don't know about host 127.0.0.1");
                System.exit(1);
            } 
            catch (IOException e) 
            {
                System.err.println("Couldn't get I/O for the connection to 127.0.0.1");
                System.exit(1);
            }
    Je ne comprends pas comment bien me servir de PrintWriter et BufferedReader et les tests que je fais me retournent souvent une "erreur" IOException coté serveur ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Exception in thread "Thread-1" java.lang.OutOfMemoryError: Java heap space
    	at java.util.Arrays.copyOf(Arrays.java:3332)
    	at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
    	at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:596)
    	at java.lang.StringBuffer.append(StringBuffer.java:367)
    	at java.io.BufferedReader.readLine(BufferedReader.java:370)
    	at java.io.BufferedReader.readLine(BufferedReader.java:389)
    	at mtserver.ListenServer.run(ListenServer.java:41)
    comment bien recevoir une donnée ou comment bien la transmettre ?

    merci

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    t'es vraiment sûr que tu obtiens cette erreur-là avec ce code-là ? J'ai beaucoup de mal à y croire. Moi je crois que tu obtiens cette erreur avec un autre code que celui-là.

    comment bien recevoir une donnée ou comment bien la transmettre ?
    Ben, pour la transmission c'est bien. En gros, il faut envoyer un message en faisant en sorte que le receveur sache quand ce message s'arrête.
    Ici tu utilises PrintWriter et la méthode println(). Ils envoient des messages sous forme de texte et s'assurent que ça se termine par une fin de ligne. En bonus, PrintWriter est réglé pour faire un flush() automatique lors des fins de ligne, ce qui fait donc que le message est bel et bien envoyé sur le réseau au moment où tu le demandes.

    À la réception, tu utilises BufferedReader et la méthode readLine() donc c'est bon aussi. Le receveur lit le message jusqu'à ce qu'il rencontre une fin de ligne, ce qui annonce la fin du message.
    Les deux sont cohérents et le principe fonctionne très bien.

    Par contre, si tu veux afficher un message reçu, il faudrait peut-être faire un System.out.println() de ce message, non ?
    Quand tu appelles readLine(), cela lit une ligne du flot de lecture de la socket. Autrement dit un message, puisque les messages se finissent par une fin de ligne.
    Ben, après l'avoir lu, tu pourrais prendre la peine de stocker ce message dans une variable String, non ? Et ensuite de l'afficher avec System.out.println()...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    Et ensuite de l'afficher avec System.out.println()...
    ha oui, ça fonctionne lol je pensais que le serveur aller afficher le message directement. ><

    t'es vraiment sûr que tu obtiens cette erreur-là avec ce code-là ?
    C'est à cause d'une classe thread, j'ai pas mis les classes entière dans mon premier post.

    en fait j'voulais pouvoir entrer des commandes dans mon serveur mais le listen clientS = serverS.accept(); m'empêchait d'écrire quoi que ce soit dans la console donc j'ai fait une classe thread avec un scanner mais comme je n'ai pas l'habitude, j'ai eu des erreurs diverses et variés et j'avais un peu de mal à y voir claire.
    mais là c'est bien du coup, mon message est bien transmis et je peux toujours faire une commande pour l'afficher au besoin sinon mon client spam mon serveur et je ne peux pas entrée de commande non plus. ^^;


    je suis tombé la dessus après avoir lu ta réponse mais je verrai plus tard pour le flush();
    je connais pas encore @override et j'ai d'autres truc à tester avec mon serveur du coup ou les boucles d’exécution de mes différents threads.

    merci.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    Je relance le sujet, je ne comprends pas de trop comment contrôler mon flux entre clients et serveur.
    J'arrive à envoyer un message en boucle du serveur au client ou inversement, la connexion reste active.
    J'arrive plus ou moins à envoyer une info unique aussi mais une fois l'info transmise, la connexion se ferme; ou si j'essaye d'envoyer une réponse ensuite, je me retrouve dans une sorte de boucle qui n'était pas prévue et le programme est comme en pause.

    Du coup, je n'arrive pas à contrôler mon flux parce que si j'utilise par exemple while(in.readLine()!=null) j'ai l'impression que l'info est lu pendant qu'elle est considéré comme condition de ma boucle et donc ensuite ma boucle n'est plus valable parce que l'info a déjà été lu et readLine() est déjà devenu null.
    il y a un exemple de contrôle de flux sur le tuto des serveurs multithread mais j'ai pas bien compris son fonctionnement.

    je peux très bien créer une nouvelle connexion à chaque foi que je veux transmettre une info du serveur au client ou inversement mais je ne crois pas que ce soit la bonne méthode.
    bref, si quelqu'un peut m'éclairer sur les dialogues client-serveur, ça serait sympa.

    merci.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello de nouveau,

    Citation Envoyé par noals Voir le message
    Du coup, je n'arrive pas à contrôler mon flux parce que si j'utilise par exemple while(in.readLine()!=null) j'ai l'impression que l'info est lu pendant qu'elle est considéré comme condition de ma boucle et donc ensuite ma boucle n'est plus valable parce que l'info a déjà été lu et readLine() est déjà devenu null.
    Ben, readLine() lit la prochaine ligne.
    Donc si tu appelles readLine() dans la condition du while(), et readLine() à l'intérieur du while(), ça lit deux lignes. Et la première n'est pas gardée au-delà de la vérification de la condition.
    Une idée serait de garder la ligne lue dans une variable...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(String line = in.readLine(); line != null; line = in.readLine()) {
      // faire des trucs avec line
    }
    Citation Envoyé par noals Voir le message
    bref, si quelqu'un peut m'éclairer sur les dialogues client-serveur, ça serait sympa.
    Si c'est une architecture de l'ancien modèle, où la communication se limite à, il y a un côté, toujours le même, qui pose les questions, et l'autre qui lui donne une réponse à chaque question (éventuellement une réponse vide et donc ignorée si adéquat), alors il n'y a pas besoin de multithread.

    C'est comme notre bien vieil HTTP traditionnel. (Celui qui est en train de se faire remplacer par HTTP/2).
    Il suffit d'envoyer les questions et lire les réponses d'un côté, en prenant bien soin de flusher les questions, et de lire les questions et envoyer les réponses de l'autre côté, avec le même soin.

    Si par contre la communication est bidirectionnelle et que chaque côté peut envoyer des trucs à l'autre quand ça lui chante, là, oui il va falloir un modèle multithread. Et c'est loin d'être évident pour déterminer quand un message est en réponse d'un autre, l'idéal étant de ne pas avoir besoin de le savoir.
    Alors oui c'est compliqué, mais en même temps t'as pas choisi le plus simple. Il faut lire les explications, le code ça ne suffit pas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    c'est pour une communication bidirectionnelle et c'est là tous le problème, mon serveur accepte bien plusieurs clients en instanciant le socket serveur comme dans le tuto et quand j'avais testé la méthode de "Julien DEFAUT" pour la communication, ça définissait bien une fonction listen qui accepte les commande mais comme j'ai pas tout compris ou que ça n'était pas forcément adapté à mes besoins, j'essaye de trouver une autre solution.

    je crois que j'vais forcément devoir instancié les in et out pour chaque client qui se connecte au serveur, je vais faire d'autres tests, je verrai bien. ne serait-ce que d'écrire me permet d'y voir plus clair mais avec les threads ou "runnable", les variables "synchronised" ou autre, c'est plus difficile de s'y retrouver.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(String line = in.readLine(); line != null; line = in.readLine()) {
      // faire des trucs avec line
    }
    merci, ça me sera utile.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    Bon ben j'ai mieux réussi avec le tuto oracle et je peux contrôler mon flux comme je veux grâce à une petite fonction dans le knockknockprotocole.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        public boolean getInput(String theInput)
        {
            return true;
        }
    et ensuite je fais un nouveau thread en récupérant le theInput du client pour le vérifier dans ma base de données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (getInput(theInput))
    {
     
             if(true)
             {
                    new Auth(theInput,0); //state 0  ask for user
             }
    }
    Je ne comprenais pas bien l'unicité de la connexion ou du message transmis, faut pas perdre le fil en quelques sortes. ^^;
    merci.

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Cet exemple n'est pas du tout bidirectionnel, mais bon.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    c'est du bidirectionnel en alternance mais je dois encore implémenter un thread à mon client.
    le serveur demande le login, le client entre son login, si le login est dans la db le serveur demande le pass.
    il me manque encore une phase de traitement coté client pour crypter le pass avant de l'envoyer mais ça me fait un serveur-clients pingpong en gros.

    il faudra que je trouve un truc pour envoyer des infos du serveur vers tous les clients aussi mais j'avance à mon rythme.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/06/2018, 12h11
  2. Communication entre serveurs
    Par fefay dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 27/06/2007, 16h27
  3. Problème communication sockets serveur mutli-client
    Par muad'dib dans le forum Réseau
    Réponses: 5
    Dernier message: 17/05/2007, 02h21
  4. Réponses: 16
    Dernier message: 01/03/2007, 17h31

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