Socket.IO - 向特定用户发送消息

时间:2016-02-17 12:06:41

标签: angularjs express mongoose socket.io

假设我在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的套接字?但是,如果我们将许多套接字连接到服务器,这不会花费太多时间吗?

2 个答案:

答案 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个实时服务器。如果你正在处理分布式环境,复杂性会上升很高,但我认为目前不是你的问题。