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 :

Client/Serveur, flux bloquant une applet


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 NutellaPiou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Par défaut Client/Serveur, flux bloquant une applet
    à tous,

    J'ai quelques soucis au niveau de mon applet mais je pense que c'est dû à la communication client/serveur donc je poste ici.

    Je dois récupérer des données (chaînes de caractères) envoyées par le serveur toutes les x secondes. Je procède comme ceci pour l'envoi :

    Code serveur : 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
    public void run()
        {
            while(true)
            {
                BufferedWriter sortie = null;
                try
                {
                    sortie = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
                    for (int i = 0; i < statusDB.size(); i++)
                    {
                        ArrayList<String> specifiedDBStatus = statusDB.get(i).getHistory();
                        sortie.write("Last " + specifiedDBStatus.get(0));
                        sortie.newLine();
                        sortie.write("Actual " + specifiedDBStatus.get(1));
                        sortie.newLine();
                        sortie.flush();
                    }
                    //sortie.close();
                }
                catch (IOException ex)
                {
                    System.out.println("Erreur instanciation buffered " + ex);
                }
                try
                {
                    sleep(waitTime);
                }
                catch (InterruptedException ex)
                {
                    System.out.println("Error in wait(time) " + ex);
                }
            }
        }

    Du côté de mon client, qui n'est autre qu'une applet, je dois récupérer les données à chaque envoi. Mais une fois les données envoyées, j'ai des traitements à faire avec donc mon client ne doit pas être bloqué sur l'attente de message.

    Voici le code concernant l'action sur mes boutons :

    Code client : 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
        public void showMonitoring()
        {
            try
            {
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
     
                String data = in.readLine();
                do
                {
                    System.out.println(data);
                    data = in.readLine();
                }while(data != null);
            }
            catch (IOException ex)
            {
                Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        class ButtonConnect implements ActionListener
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    socket = new Socket("pc080034301", 8254);
                    if(socket != null)
                    {
                        connect.setEnabled(false);
                        disconnect.setEnabled(true);
                        welcome.setForeground(Color.BLACK);
                        welcome.setText("Welcome to the server !!!!!");
                        showMonitoring();
                    }                
                }
                catch (UnknownHostException ex)
                {        
                    Font police = new Font("Tahoma",Font.BOLD,25);
                    welcome.setFont(police);
                    welcome.setForeground(Color.RED);
                    welcome.setText("Connection failed due to " + ex);
                }
                catch (IOException ex)
                {
                    Font police = new Font("Tahoma",Font.BOLD,25);
                    welcome.setFont(police);
                    welcome.setForeground(Color.RED);
                    welcome.setText("Connection failed due to " + ex);
                }
            }
        }
        class ButtonDisconnect implements ActionListener
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    socket.close();
                    connect.setEnabled(true);
                    disconnect.setEnabled(false);
                    welcome.setText("Disconnected from the server...");
                }
                catch (IOException ex)
                {
                    welcome.setText("Error while disconnecting " + ex);
                }
            }        
        }

    Si du côté de mon serveur je ferme mon buffer, lors du premier envoi/lecture tout se passe bien. Mais la seconde fois, j'ai ce message d'erreur :

    Code erreur : Sélectionner tout - Visualiser dans une fenêtre à part
    java.net.SocketException: Socket is closed

    Je ne comprend pas pourquoi il ne réouvre pas un buffer

    Si par contre je ne ferme pas mon buffer, une fois que je clic sur le bouton connecté, l'applet reste figée çàd que le bouton reste enfoncé et les instructions suivantes ne s'affichent plus dans mon applet.

    Je pense que le problème vient du fait que le client bloque sur l'attente des messages du serveur => l'exécution de la suite de l'application est en attente.

    Mais comment pourrais-je faire pour récupérer les messages au bon moment sans pour autant bloquer l'applet?

    Merci d'avoir lu, et d'avance merci pour vos réponses

    < Nutella >

  2. #2
    Membre confirmé Avatar de NutellaPiou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Par défaut
    J'ai modifié quelque peu mais je suis toujours bloqué =/

    Ca ressemble à ça :

    • Un thread serveur qui attend des messages du client et envoie les résultats de la demande
    • Un thread client qui envoie les messages et reçoit les réponses du serveur


    Le problème c'est que j'arrive pas à faire communiquer les 2. Il y en a toujours un qui plante ou qui ne fait rien...

    Code serveur : 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
    public void run()
        {
            /*while(true)
            {*/
            try
            {
                BufferedReader entree = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String ligne;
                while((ligne = entree.readLine()) != null)
                {
                    if(ligne.equals("coucou"))
                    {
                        System.out.println("ON Y EST");
                        BufferedWriter sortie = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
     
                        for(int i = 0; i < statusDB.size(); i++)
                        {
                            ArrayList<String> specifiedDBStatus = statusDB.get(i).getHistory();
                            sortie.write("Last " + specifiedDBStatus.get(0));
                            //sortie.flush();
                            /*sortie.newLine();
                            sortie.write("Actual " + specifiedDBStatus.get(1));
                            sortie.flush();*/
                        }
                        sortie.flush();
                        //sortie.close();
                        System.out.println("Apres init buffersortie");
                    }
                }
            }
            catch (IOException ex)
            {
                Logger.getLogger(ServerThreadConnection.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    Code client : 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
    public void run()
        {
            try
            {
                BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                out.write("coucou");
                out.flush();
                //out.close();
                System.out.println("apres avoir ecrit");
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                System.out.println(in.readLine());
            }
            catch (IOException ex)
            {
                System.out.println("Erreur IO " + ex);
            }
        }

    J'ai fait pas mal de tests mais une fois sur deux j'ai un "socket error". Il me dit que le socket est fermé =/

    Je patauge...

  3. #3
    Membre confirmé Avatar de NutellaPiou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Par défaut
    Bon ben j'ai fait autrement, j'ai utilisé un ObjectInputStream et un ObjectOutputStream.

    J'ai tout recommencé à zéro et ça fonctionne correctement.

    Tchus

    (Vive l'auto topic )

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/05/2014, 07h03
  2. archi client serveur: envoi d'une image (java python)
    Par samantha93 dans le forum Général Python
    Réponses: 0
    Dernier message: 19/02/2014, 14h53
  3. Réponses: 1
    Dernier message: 15/01/2010, 09h59
  4. Communication client/serveur: recherche d'une solution
    Par Razmoket dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 20/03/2007, 17h57
  5. [Architecture][Strategie] Client/Serveur Choix d'une architecture
    Par etiennegaloup dans le forum Général Java
    Réponses: 7
    Dernier message: 06/07/2005, 12h00

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