web-dev-qa-db-fra.com

Rejoindre la salle socket io lors de la connexion

J'essaye de faire un utilisateur connecté pour rejoindre une certaine salle socket.io lors de la connexion. Selon tous les exemples que j'ai trouvés sur le net, il semble que j'aie émis une action du client pour pouvoir rejoindre une pièce. Quelque chose comme:

socket.on('connect', function() {
   socket.emit('join', 'room1');
});

Server.js:

io.sockets.on('connection', function(socket) {
    socket.on('join', function(room) {
        socket.join(room);
    });
});

Et selon la plupart des tutoriels, cela devrait fonctionner.

Ce que je pense faire, c'est:

socket.on('connect', function() {
   socket.join('room1');
});

Mais cela ne semble pas fonctionner car les messages que j'émets du serveur ne sont pas capturés par le client. Une idée, qu'est-ce que je fais mal? Est-ce possible en général?

15
ArkadyB

Il n'y a pas de méthode .join() côté client. Les chambres sont purement une construction côté serveur et le client n'en sait rien.

Votre premier bloc de code est la façon souhaitée de faire les choses. Vous envoyez au serveur un message de votre conception lui demandant de joindre le socket à une pièce et la .join() est exécutée côté serveur.

14
jfriend00

Cela devrait être ce dont vous avez besoin. N'hésitez pas à transmettre le nom de la chambre que vous souhaitez par le biais du client. Seul le serveur peut gérer l'attribution d'une prise à une pièce.

Serveur:

  io.sockets.on('connection', function(socket) {
    socket.on('join', function(room) {
    socket.join(room);
    });
});

Client:

 socket.emit('join', roomNum);
15
Bk Razor

Ceci est facilement réalisable. Il vous suffit de transmettre un paramètre de requête que le serveur comprend.

L'exemple suivant n'est pas entièrement testé, mais l'idée fonctionnera. Dans cet exemple, le nom de la pièce est déterminé à partir de window.location.href sur le client.

Client

// Last segment of path is roomName
var roomName = window.location.href.substr(window.location.href.lastIndexOf('/') + 1);
var socket = io({
    query: {
        roomName: roomName,
    },
});

Serveur

var io = require('socket.io')(server);
io.on('connection', function(socket) {
    var query = socket.handshake.query;
    var roomName = query.roomName;
    if(!roomName) {
        // Handle this as required
    }
    socket.join(roomName);
});
2
Guru Prasad