Bonjour à tous,

Je suis en train de développer un chat en Java (un projet pour les cours) et je me frotte à un petit soucis.

Pour me simplifier la vie, j'ai utilisé Kryonet pour la liaison client/serveur.

Je souhaite pour ce chat avoir une méthode me permettant d'envoyer une requête au serveur et d'attendre sa réponse pour pouvoir l'utiliser.

Par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
Response r = Network.sendAndWaitForResponse(new Request());
// Utiliser r
// ...
Voici donc comment j'ai procédé :
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
public class Network extends Thread {
 
    private static final Client client = new Client();
 
    private static Network _instance;
    private static HashMap<Integer, Response<?>> responses = new HashMap<Integer, Response<?>>(); // Stockage des réponses avec l'id de la requête
 
    public static Network getInstance() {
        synchronized (Network.class) {
            if (_instance == null) _instance = new Network();
        }
        return _instance;
    }
 
    public Network() {
        client.start();
        Kryo kryo = client.getKryo();
        // Registers Kryo
        // ...
    }
 
    public void run() {
        try {
            client.connect(5000, "127.0.0.1", 6789);
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        client.addListener(new Listener() {
            public void received (Connection connection, Object object) {
 
                System.out.println("On reçoit une réponse");
 
                if (object instanceof Response) {
                    Response<?> response = (Response<?>) object;
                    responses.put(response.id, response); // On met la réponse dans le tableau des réponses avec l'id de la requête
                }
            }
        });
    }
 
    public static Response<?> sendAndWaitForResponse(Request r) {
        long start = System.currentTimeMillis();
        int requestId = r.id; // Id de la requête
 
        client.sendTCP(r);   // On envoie la requête au serveur
 
        // Tant que la réponse n'est pas dans le tableau de réponses, on attend
        while(!responses.containsKey(requestId)) {
            if(System.currentTimeMillis() > start+1000) {
                JOptionPane.showMessageDialog(MainController.currentWindow, "La réponse n'a pas été reçue.", "Erreur", JOptionPane.ERROR_MESSAGE);
                System.exit(1);
            }
            try { sleep(10); } catch (InterruptedException e) { e.printStackTrace(); }
        }
 
        // On a reçu la réponse, on la retourne à l'endroit où sendAndWaitForResponse a été appelé pour l'utiliser
        return responses.remove(requestId);
    }
 
}
Le problème que j'ai avec cette solution, c'est que pendant le while() qui attend que la réponse soit stockée dans le tableau de réponses, mon serveur kryonet n'est plus à l'écoute des requêtes et ne reçoit donc pas la réponse à ma requête.

Y aurait-il des connaisseurs de Kryonet qui pourraient me venir en aide s'il vous plait, je dois avouer que je suis un peu bloqué..

En vous remerciant par avance !