Bonjour,

Depuis peu j'utilise node.js et socket.io, qui me permet à chaque utilisateur d'afficher une liste de joueurs avec rafraichissement tout les 2 secondes d'un serveur de jeu en ligne.

Sachant que j'ai plusieurs serveurs de jeu, je souhaite faire une seul requete pour tout les sockets qui regarde le même serveur.

A l'heure actuelle c'est une requête par socket, c'est à dire, si j'ai 4 utilisateurs qui regarde le même serveur, donc 4 requêtes simultanément.

Moi le but c'est d'afficher une requête pour ces 4 utilisateurs, mais je sais pas comment procéder.

Voici une parti du code coté serveur :

io.sockets.on('connection', function (socket) {

    console.log('Utilisateur vient de se connecté !');

    socket.on('load_player_list', function(server_id){
        setTimeout(function(){
            load_player_list(socket, server_id);
        },2000);
    })

    socket.on('disconnect', function(){
        console.log('Utilisateur vient de se déconnecté !');
    });
});

La partie du code partie client :

socket.on('connect', function(){
        socket.emit('load_player_list', server_id);
});

Si quelqu'un à une idée sur mon problème :)

Merci d'avance.

8 réponses


Salut,

Ce que tu peux faire c'est créé un serveur principal ou tu reçoie toute les informations des serveurs de jeux, et ce serveur principal s'occupera de renvoyé ça ou il le faut

CenT
Auteur

C'est pas comme ça que ça marche. Une requête correspond à charger un json généré en php qui correspond au informations du serveur de jeux en temps réel. Je ne peux me permettre de le faire sur l'ensemble des serveurs en une seul fois, ce n'est pas possible.

Dit moi si j'ai bien compris,

Ce que tu souhaite, c'est de pouvoir récupéré la liste de tout les joueurs en ligne sur tout les serveurs de jeux c'est bien ça ?

CenT
Auteur

non, relis mon premier message : "Sachant que j'ai plusieurs serveurs de jeu, je souhaite faire une seul requete pour tout les sockets qui regarde le même serveur. "

Donc par example, je consulte le serveur avec l'id numéro 10, moi (moi le client) envoi un emit au serveur pour demander la liste et par la suite le serveur reçoit puis envoi un emit avec les données demandées, le client reçoit, affiche les infos et renvoi un emit au serveur pour re-demander la liste, ainsi dessuite etc...

Quand je suis tout seul pas de problème.

Mais si on est plusieurs utilisateurs (plusieurs clients) à demander les même informations pour le même serveur, les requête se multiplie, se que je recherche c'est de pouvoir faire une requête pour les clients qui veulent avoir les infos pour le même serveur.

C'est bête si 10 utilisateurs demande et reçoit 10x les même infos toutes les 2 secondes.
Si je peux faire 1 seule requête toutes les 2 secondes pour les 10 utilisateurs c'est mieux :)

Pas facile à l'écrit d'expliquer ^^

[EDIT] La solution est peut être le système de room, mais j'arrive pas tout à fait à le mettre en œuvre.

Je voie très bien ce que tu veux faire que ce sois une requête ajax ou un fichier json, ou une websocket, tu devra quand même faire une requête pour chaque utilisateur.
Car ce que tu veux faire c'est de groupé les requêtes, pour éviter qu'il y en est trop, mais à la fin il faut qu'en même dispatcher les requêtes à ceux qu'il l'on demandé

Tout ce que je peux te conseillé déjà c'est la suppression du setTimeout, car le serveur est capable de savoir si quelque chose a été modifié donc dans ce cas la pas besoin de la renvoyer en boucle mais seulement quand une information change.

[EDIT] Le système de room est pas compliqué, mais ça revient à la même chose sauf l'information est cloisonné par room

CenT
Auteur

si j'enlève le settimeout il demande l'info à une vitesse folle, et même des requête son en erreur car il ont pas le temps d'être généré.
Pour que tu comprenne, faut communication vocal et une visu via réunion teamviewer pour te montrer réelement le truc.

Je suis pas sûre d'avoir compris ce que tu voulais faire mais si tu veux que lorsque que l'évenement "load_players_list" est capturé envoyer la liste a tous les clients tu peux le faire comme ça :

socket.on('load_player_list', function(server_id){
        io.sockets.emit('load_player_list', getPlayerList(server_id));
    });

Oui, mais quand il parlais de serveur de jeux, ce n'étais pas un serveur de jeux codé en node, mais bien un serveur de jeux, de type source engine