Socket.io отправить пакет только отправителю

Мне еще предстоит выяснить, как напрямую реагировать только на отправителя, используя socket.io

Я узнал, что io.sockets.emit отправляется всем клиентам, но я не хочу отправлять информацию отправителю.

код:

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!" });
      }
    });
});

Ответы

Ответ 1

Когда ваш сервер слушает, вы обычно получаете сокет в событии "connection":

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

Сокет соединяет 2 точки: клиент и сервер. Когда вы выбрасываете этот сокет, вы выбрасываете этот конкретный клиент.

Пример:

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

Будьте осторожны, это два разных вызова:

  • socket.emit: испускать только один сокет
  • io.sockets.emit: испускать все сокеты

Ответ 2

Простой пример

Синтаксис запутан в socketio. Кроме того, каждый сокет автоматически подключается к собственной комнате с идентификатором socket.id (так как частный чат работает в сокетке, они используют комнаты).

Отправить отправителю и никому другому

socket.emit('hello', msg);

Отправить всем, включая отправителя (если отправитель находится в комнате) в комнате "Моя комната"

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

Отправить всем, кроме отправителя (если отправитель находится в комнате) в комнате "Моя комната"

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

Отправить всем в каждой комнате, включая отправителя

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

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

Отправить только в конкретный сокет (частный чат)

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

Ответ 3

поздно, но лучше, чем никогда;)

У меня было что-то вроде этого:

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

После некоторого тестирования я понял, что "this.emit" внутри закрытого закрытого события отправляется обратно только отправителю. Поэтому я попробовал "this.broadcast.emit", которые отправляют сообщение всем подключенным, кроме отправителя. Я считаю, что это то, что вы хотите от своего кода.