à 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 >