假设我在MongoDB中有以下Schema:
var postSchema = new mongoose.Schema({
owner: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
contributors: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }]
});
每个帖子必须拥有所有者,并且可能有许多贡献者(由所有者添加)。
当所有者或任何贡献者对post对象进行更改时,我需要实时(使用Socket.IO)将更改通知给所有关联用户。
但是我对如何做到这一点有一些疑问...我的意思是,我知道Socket.IO有一些方法可以向特定用户发送消息,但我们需要知道SocketID。如何将UserID与SocketID相关联?我可以将其添加为属性,然后遍历所有套接字以查找具有所需UserID的套接字?但是,如果我们将许多套接字连接到服务器,这不会花费太多时间吗?
答案 0 :(得分:1)
确定:简单,
这就是你需要的:
io.to(socket.id).emit("event", data);
每当用户加入服务器时,都会生成包含ID的套接字详细信息。这个ID确实有助于向特定人员发送消息。
首先我们需要将所有socket.id存储在数组中,
var people={};
people[name] = socket.id;
此处名称是接收者名称。例如:
people["ccccc"]=2387423cjhgfwerwer23;
所以,现在我们可以在发送消息时使用接收者名称获取socket.id:
为此我们需要知道recievername.You需要向服务器发出接收者名称。
最后一件事是:
socket.on('chat message', function(data){
io.to(people[data.reciever]).emit('chat message', data.msg);
});
希望这适合你。!!祝你好运
答案 1 :(得分:0)
如果你支持来自一个用户的多个连接,通常你会使用{id: socket}
或{id: [sockets]}
形式的hashmap(即JavaScript中的对象)。
例如
var sockets = {};
现在,当建立连接并且您拥有socket
对象时,您可以对用户进行身份验证,然后执行
sockets[id] = socket;
如果您想要使用id
向用户发送消息,则只需
sockets[id].emit(...);
您必须记住的一件事是,一旦断开连接,就从sockets
对象中删除套接字,否则您将发生内存泄漏。
所有这一切都假设您只处理1个实时服务器。如果你正在处理分布式环境,复杂性会上升很高,但我认为目前不是你的问题。