【问题标题】:Emiting with exclusion in Socket.io在 Socket.io 中排除发射
【发布时间】:2013-09-06 09:15:23
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 这正是房间的设计目的。你知道一个用户可以同时出现在多个房间吗?在 a/b 之间进行选择取决于安全级别,以防用户被完全禁止查看消息,b) 它可能更容易完成并且在性能方面:您不必提供的客户端任务**** 关于。所以我会选择 b)。
  • 如果你绝对不能向用户显示味精..然后去a......如果用户可以在网络流中看到它......比b可能更容易跨度>
  • 是的,我知道一个客户可以在多个房间中,但问题是:我必须创建与我拥有的客户一样多的房间(因为我需要向所有人发送消息,除了一次一个不同的用户),我真的不确定它的性能。另一方面,客户端的东西看起来很麻烦:(
  • 这样的事情在 2019 年仍然没有出现,造成了很多痛苦。

标签: javascript node.js socket.io


【解决方案1】:

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

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

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

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

其实它也可以用作房间。

【讨论】:

  • 我接受你的回答是有效的,因为这会起作用,无论如何,我已经做了客户端过滤器,我不会改变它(因为项目时间安排很匆忙...... )
  • 当开发人员被“业务”推动而导致这种技术妥协时,这很可悲。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 2018-12-29
相关资源
最近更新 更多