有没有办法通过socket.io发出消息,同时排除一些套接字ID? 我知道房间的存在,但对我来说这是禁忌。
如果我正在尝试的是不可能的,那么我应该在这两件事之间做些什么:
a)迭代我想要发送消息的所有用户(事实上,除1之外的所有用户)并为每个套接字执行一次发光
或
b)只需向所有人发送消息,并在客户端做一些hacky“忽略”消息。
编辑:我无法进行广播,因为消息是从服务器端生成的(因此没有客户端交互)。
答案 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);
});
});
事实上它也可以用作房间。