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);
}
} |
Partager