J'ai essayé d’illustrer ci-dessous (en gros) comment moi je vois les choses.
J'ai pris l'exemple du problème de savoir qui est dans un lieu, en prenant le cas suivant :
- joueurA commence le jeu à 12:00:00 (avec un joueurB déjà connecté)
- joueurB entre dans le lieu à 12:20:00
- joueurB ressort du lieu à 12:25:00
- joueurA arrête le jeu à 13:00:00
Avec XHR classique (1 requête = 1 réponse).
Il y a la solution de l'attente active (exemple d'une communication client/serveur pour 1 joueur) :
C'est un peu une solution en mode colocataire ultra relou, avec plein de requêtes qui ne servent à rien.
Il y a la solution du long-polling (exemple d'une communication client/serveur pour 1 joueur) :
C'est une solution moins coûteuse que la précédente (en nb d'échanges client/serveur) mais qui implique :
- pour le serveur de savoir garder la requête XHR ouverte et à ne faire la réponse qu'au moment opportun (quand une action est effectuée par un autre joueur, le serveur doit notifier les joueurs pour lesquels il a des XHR en mémoire et qui sont concernés par l'action)
- pour le client de bien renvoyer une requête à chaque fois qu'il reçoit une réponse
Avec des tunnels de communication bidirectionnels où client & serveur peuvent s'envoyer des messages quand ils le veulent.
Il y a la notification sur évènement côté serveur (exemple d'une communication client/serveur pour 2 joueurs) :
C'est une solution qui implique pour le serveur de bien notifier toutes les personnes qu'il faut.
Il y a les push réguliers côté serveur sur le tunnel de communication (exemple d'un push toutes les 10 secondes, pour 2 joueurs) :
C'est un peu une solution en mode distribution de pub centralisée avec des prospectus à distribuer aux clients connectés pour les tenir informés de l'actualité.
____
Voilà : en gros il vaut mieux éviter les solutions avec des boucles et travailler par captation d'évènement côté serveur si on peut.
J'ai pris l'exemple du problème de savoir qui est dans un lieu, en prenant le cas suivant :
- joueurA commence le jeu à 12:00:00 (avec un joueurB déjà connecté)
- joueurB entre dans le lieu à 12:20:00
- joueurB ressort du lieu à 12:25:00
- joueurA arrête le jeu à 13:00:00
Avec XHR classique (1 requête = 1 réponse).
Il y a la solution de l'attente active (exemple d'une communication client/serveur pour 1 joueur) :
Code :
12:00:00 - Client : Est-ce qu'il y a du nouveau ? (HttpRequest)
12:00:00 - Serveur : Non. (HttpResponse)
12:00:01 - Client : Est-ce qu'il y a du nouveau ? (HttpRequest)
12:00:01 - Serveur : Non. (HttpResponse)
12:00:02 - Client : Est-ce qu'il y a du nouveau ? (HttpRequest)
12:00:02 - Serveur : Non. (HttpResponse)
12:00:03 - Client : Est-ce qu'il y a du nouveau ? (HttpRequest)
12:00:03 - Serveur : Non. (HttpResponse)
... [plein de XHR]
12:19:58 - Client : Est-ce qu'il y a du nouveau ? (HttpRequest)
12:19:58 - Serveur : Non. (HttpResponse)
12:19:59 - Client : Est-ce qu'il y a du nouveau ? (HttpRequest)
12:19:59 - Serveur : Non. (HttpResponse)
12:20:00 - Client : Est-ce qu'il y a du nouveau ? (HttpRequest)
12:20:00- Serveur : Oui ! Il y a joueurB qui est rentré dans le lieu ! (HttpResponse)
12:20:01 - Client : Est-ce qu'il y a du nouveau ? (HttpRequest)
12:20:01 - Serveur : Non. (HttpResponse)
... [plein de XHR]
12:24:58 - Client : Est-ce qu'il y a du nouveau ? (HttpRequest)
12:24:58 - Serveur : Non. (HttpResponse)
12:24:59 - Client : Est-ce qu'il y a du nouveau ? (HttpRequest)
12:24:59 - Serveur : Non. (HttpResponse)
12:25:00 - Client : Est-ce qu'il y a du nouveau ? (HttpRequest)
12:25:00- Serveur : Oui ! Il y a joueurB qui a quitté le lieu ! (HttpResponse)
12:25:01 - Client : Est-ce qu'il y a du nouveau ? (HttpRequest)
12:25:01 - Serveur : Non. (HttpResponse)
... [plein de XHR]
12:59:58 - Client : Est-ce qu'il y a du nouveau ? (HttpRequest)
12:59:58 - Serveur : Non. (HttpResponse)
12:59:59 - Client : Est-ce qu'il y a du nouveau ? (HttpRequest)
12:59:59 - Serveur : Non. (HttpResponse)
13:00:00 - Client : Je me casse ; c'est nul ce jeu !
C'est un peu une solution en mode colocataire ultra relou, avec plein de requêtes qui ne servent à rien.
Il y a la solution du long-polling (exemple d'une communication client/serveur pour 1 joueur) :
Code :
12:00:00 - Client : OK ! Dis-moi quand il y a du nouveau (HttpRequest)
12:20:00 - Serveur : Il y a l'omniscient qui est rentré dans le lieu ! (HttpResponse)
12:20:01 - Client : OK ! Dis-moi quand il y a du nouveau (HttpRequest)
12:25:00 - Serveur : Il y a l'omniscient qui a quitté le lieu ! (HttpResponse)
12:25:01 - Client : OK ! Dis-moi quand il y a du nouveau (HttpRequest)
13:00:00 - Client : Je me casse ; c'est nul ce jeu ! (Mais au moins je fais pas le relou.)
C'est une solution moins coûteuse que la précédente (en nb d'échanges client/serveur) mais qui implique :
- pour le serveur de savoir garder la requête XHR ouverte et à ne faire la réponse qu'au moment opportun (quand une action est effectuée par un autre joueur, le serveur doit notifier les joueurs pour lesquels il a des XHR en mémoire et qui sont concernés par l'action)
- pour le client de bien renvoyer une requête à chaque fois qu'il reçoit une réponse
Avec des tunnels de communication bidirectionnels où client & serveur peuvent s'envoyer des messages quand ils le veulent.
Il y a la notification sur évènement côté serveur (exemple d'une communication client/serveur pour 2 joueurs) :
Code :
12:00:00 - Client (JoueurA) : Je me connecte (message client => serveur)
12:00:00 - Serveur (au JoueurA) : Ok, voici les infos dont tu as besoin (message serveur => client)
12:20:00 - Client (JoueurB) : Je vais dans le lieu (message client => serveur)
12:20:00 - Serveur (au JoueurB) : Ok, j'ai bien pris en compte ton action (message serveur => client)
12:20:00 - Serveur (au JoueurA) : Hey, il y joueur B qui se ramène (message serveur => client)
12:25:00 - Client (JoueurB) : Je quitte le lieu (message client => serveur)
12:25:00 - Serveur (au JoueurB) : Ok, j'ai bien pris en compte ton action (message serveur => client)
12:25:00 - Serveur (au JoueurA) : Hey, il y joueur B qui s'en va (message serveur => client)
13:00:00 - Client (JoueurA) : Je me casse ; c'est nul ce jeu ! (message client => serveur)
C'est une solution qui implique pour le serveur de bien notifier toutes les personnes qu'il faut.
Il y a les push réguliers côté serveur sur le tunnel de communication (exemple d'un push toutes les 10 secondes, pour 2 joueurs) :
Code :
12:00:00 - Client (JoueurA) je me connecte (message client => serveur)
12:00:05 - Serveur (au JoueurA) Sur le lieu 1 il y a que toi (message serveur => client)
12:00:05 - Serveur (au JoueurB) Sur le lieu 2 il y a que toi (message serveur => client)
12:00:15 - Serveur (au JoueurA) Sur le lieu 1 il y a que toi (message serveur => client)
12:00:15 - Serveur (au JoueurB) Sur le lieu 2 il y a que toi (message serveur => client)
12:00:25 - Serveur (au JoueurA) Sur le lieu 1 il y a que toi (message serveur => client)
12:00:25 - Serveur (au JoueurB) Sur le lieu 2 il y a que toi (message serveur => client)
... [plein de messages]
12:19:55 - Serveur (au JoueurA) Sur le lieu 1 il y a que toi (message serveur => client)
12:19:55 - Serveur (au joueurB) Sur le lieu 2 il y a que toi (message serveur => client)
12:20:00 - Client (JoueurB) : Je pars du lieu 2 et je vais dans le lieu 1 (message client => serveur)
12:20:05 - Serveur (au JoueurA) Sur le lieu 1 vous êtes 2 ! (message serveur => client)
12:20:05 - Serveur (au JoueurB) Sur le lieu 1 vous êtes 2 ! (message serveur => client)
12:20:15 - Serveur (au JoueurA) Sur le lieu 1 vous êtes 2 ! (message serveur => client)
12:20:15 - Serveur (au JoueurB) Sur le lieu 1 vous êtes 2 ! (message serveur => client)
... [plein de messages]
12:24:55 - Serveur (au JoueurA) Sur le lieu 1 vous êtes 2 ! (message serveur => client)
12:24:55 - Serveur (au joueurB) Sur le lieu 1 vous êtes 2 ! (message serveur => client)
12:25:00 - Client (JoueurB) : Je pars du lieu 1 et je vais dans le lieu 3 (message client => serveur)
12:25:05 - Serveur (au JoueurA) Sur le lieu 1 il y a que toi ! (message serveur => client)
12:25:05 - Serveur (au JoueurB) Sur le lieu 3 il y a que toi ! (message serveur => client)
12:25:15 - Serveur (au JoueurA) Sur le lieu 1 il y a que toi ! (message serveur => client)
12:25:15 - Serveur (au JoueurB) Sur le lieu 3 il y a que toi ! (message serveur => client)
... [plein de messages]
13:00:00 - Client (JoueurA) : Je me casse ; c'est nul ce jeu ! (message client => serveur)
C'est un peu une solution en mode distribution de pub centralisée avec des prospectus à distribuer aux clients connectés pour les tenir informés de l'actualité.
____
Voilà : en gros il vaut mieux éviter les solutions avec des boucles et travailler par captation d'évènement côté serveur si on peut.