5

有没有办法通过socket.io发出消息,同时排除一些套接字ID?我知道房间的存在,但这对我来说是禁忌。

如果我正在尝试的事情是不可能的,那么我应该在这两件事之间做些什么:

a) 遍历我想要发送消息的所有用户(事实上,除了 1 之外的所有用户)并为每个套接字执行发射

或者

b)只需将消息发送给每个人,并在客户端做一些骇人听闻的事情来“忽略”消息。

编辑:我无法进行广播,因为消息是从服务器端生成的(因此没有客户端交互)。

4

1 回答 1

4

房间 - 不是完成您想要做的事情的方式,因为它们仅用于限制人群,但不是特定的。

您正在寻找的是简单的用户集合以及对他们设置某种过滤器的能力。通过套接字列表进行迭代 - 并不像广播时那样重要 - 无论如何它都会进行迭代。

所以这里有一个小类,它保留套接字,在需要时删除它们(断开连接)并向所有人发送消息,可选的单个套接字例外。

function Sockets() {
  this.list = [ ];
}
Sockets.prototype.add = function(socket) {
  this.list.push(socket);

  var self = this;
  socket.on('disconnect', function() {
    self.remove(socket);
  });
}
Sockets.prototype.remove = function(socket) {
  var i = this.list.indexOf(socket);
  if (i != -1) {
    this.list.splice(i, 1);
  }
}
Sockets.prototype.emit = function(name, data, except) {
  var i = this.list.length;
  while(i--) {
    if (this.list[i] != except) {
      this.list[i].emit(name, data)
    }
  }
}

这是使用示例,用户发送带有一些数据的“发布”消息,服务器只是将其发送给除了原始发件人之外的所有集合:

var collection = new Sockets();

io.on('connection', function(socket) {
  collection.add(socket);

  socket.on('post', function(data) {
    collection.emit('post', data, socket);
  });
});

事实上,它也可以用作房间。

于 2013-09-06T14:00:36.927 回答