在Socket.io中排除

时间:2013-09-06 09:15:24

标签: javascript node.js socket.io

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

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

a)迭代我想要发送消息的所有用户(事实上,除1之外的所有用户)并为每个套接字执行一次发光

b)只需向所有人发送消息,并在客户端做一些hacky“忽略”消息。

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

1 个答案:

答案 0 :(得分:2)

房间 - 不是完成你想要做的事情的方法,因为它们只是用来限制一群人,而不是特定的。

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

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

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

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