web-dev-qa-db-fra.com

socket.io envoie un paquet à l'expéditeur uniquement

Je n'ai pas encore compris comment répondre directement à l'expéditeur uniquement à l'aide de socket.io

J'ai appris que io.sockets.emit envoie à tous les clients mais je ne renverrai pas d'informations à l'expéditeur.

code:

socket.on('login', function (data) {
    db.users.find({username: cc.lowerCase(data.username)}, function(err, users) {
      if (users.length > 0) {
        users.forEach( function(user) {
          console.log(user.length);
          if (user.password == data.password) {
            io.sockets.emit('login', { username: user.username });
          } else {
            io.sockets.emit('error', { message: "Wrong username or password!" });
          }
        });
      } else {
        io.sockets.emit('error', { message: "Wrong username or password!" });
      }
    });
});
16
Zander17

Lorsque votre serveur écoute, vous obtenez généralement un socket lors de l'événement "connection":

require('socket.io').on('connect', function(socket){

Un socket connecte 2 points: le client et le serveur. Lorsque vous émettez sur ce socket, vous émettez vers ce client spécifique.

Exemple :

var io = require('socket.io');
io.on('connect', function(socket){
    socket.on('A', function(something){
        // we just received a message
        // let's respond to *that* client :
        socket.emit('B', somethingElse);
    });
});

Veillez à ce que ce soient deux appels différents:

  • socket.emit: émettre sur un seul socket
  • io.sockets.emit: émettre vers tous les sockets
37
Denys Séguret

Exemple simple

La syntaxe est déroutante dans socketio. De plus, chaque socket est automatiquement connecté à sa propre salle avec l'id socket.id (c'est comment le chat privé fonctionne dans socketio, ils utilisent des salles).

Envoyer à l'expéditeur et à personne d'autre

socket.emit('hello', msg);

Envoyer à tout le monde y compris l'expéditeur (si l'expéditeur est dans la pièce) dans la pièce "ma chambre"

io.to('my room').emit('hello', msg);

Envoyer à tout le monde sauf l'expéditeur (si l'expéditeur est dans la pièce) dans la pièce "ma chambre"

socket.broadcast.to('my room').emit('hello', msg);

Envoyer à tout le monde dans chaque pièce, y compris l'expéditeur

io.emit('hello', msg); // short version

io.sockets.emit('hello', msg);

Envoyer à un socket spécifique uniquement (chat privé)

socket.broadcast.to(otherSocket.id).emit('hello', msg);
21
Karl Morrison

tard mais mieux que jamais;)

J'ai eu comme ça:

io.on('connection', function(socket){
    socket.emit('some event', data);
    socket.on('private event', function(message){
        this.emit('other private event', message);
    }
}

Après quelques tests, je me suis rendu compte que la fermeture 'this.emit' à l'intérieur de 'l'événement privé' renvoyait uniquement à l'expéditeur. J'ai donc essayé 'this.broadcast.emit', qui envoie le message à tous les utilisateurs connectés, à l'exception de l'expéditeur. Je crois que c'est ce que vous voulez de votre code.

0
Armando Vrushi