当前位置: 首页 > 知识库问答 >
问题:

插座。IO -向特定用户发送消息

程博学
2023-03-14

假设我在MongoDB中有以下模式:

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。如何将用户 ID 与套接字 ID 相关联?我是否可以将其添加为属性,然后遍历所有套接字以查找具有所需用户 ID 的套接字?但是,如果我们有许多套接字连接到服务器,这不会花费太多时间吗?

共有2个答案

归德厚
2023-03-14

通常,如果您支持来自一个用户的多个连接,您将使用{id:socket}{id:[sockets]}形式的哈希图(即JavaScript中的对象)。

例如

var sockets = {};

现在,当建立连接并且您有一个套接字对象时,您可以对您的用户进行身份验证,然后简单地执行

sockets[id] = socket;

一旦您有一条消息要发送给带有id的用户,您只需这样做

sockets[id].emit(...);

您必须记住的一件事是,一旦套接字断开连接,就从套接字对象中删除套接字,否则您将遇到内存泄漏。

所有这些都假设您只处理一台实时服务器。如果您正在处理分布式环境,那么复杂性会非常高,但我想这不是您目前的问题。

余阳秋
2023-03-14

当然:简单地说,

这就是您需要的:

  io.to(socket.id).emit("event", data);

每当用户加入服务器时,都会生成套接字详细信息,包括ID。这是ID真正有助于向特定用户发送消息。

首先,我们需要将所有socket.ids存储在数组中,

 var people={};

 people[name] =  socket.id;

这里的名字是接收者的名字。例:

 people["ccccc"]=2387423cjhgfwerwer23;

因此,现在我们可以在每次发送消息时使用接收者名称 socket.id:

为此,我们需要知道接收者名称。您需要向服务器发出接收者的名称。

最后一件事是:

 socket.on('chat message', function(data){
 io.to(people[data.reciever]).emit('chat message', data.msg);
 });

希望这对你有好处。!!祝你好运

 类似资料:
  • 我是新手。NET(C#)和WebSocket。。。我已经安装了VS2012和Windows Server 2012,并且已经启动并运行了WebSocket。我似乎无法从一个套接字接收消息并将其发送到另一个特定的套接字。唯一的选择似乎是向所有套接字广播消息。有没有一种方法可以将消息只发送给特定的用户?我希望聊天室主持人有机会拒绝不适当的帖子。

  • 我使用本教程中描述的spring设置了一个WebSocket:https://spring.io/guides/gs/messaging-stomp-websocket/。我需要的是我的服务器每5秒向特定用户发出一条消息。所以我首先做了这个: 而且起作用了。现在,为了只向特定用户发送消息,我更改了以下内容: 在WebSocketConfig.java中添加队列: 更改GreetingControl

  • 问题内容: 如何仅从服务器向特定用户发送websocket消息? 我的webapp具有spring安全设置,并使用websocket。我在尝试仅从服务器向特定用户发送消息时遇到棘手的问题。 通过阅读手册,我的理解是来自我们可以做的服务器 在客户端: 但是我永远无法调用订阅回调。我尝试了许多不同的方法,但是没有运气。 如果我将其发送到/ topic / reply,它可以工作,但所有其他已连接用户也

  • 我正在阅读《Spring in Action4》一书,以使用WebSocket上的STOMP消息传递。 假设,如下所示: 然后客户端使用以下JavaScript代码订阅目标: 则该消息将发送到目的地,如下所示: 那么,两个目的地和看起来是不同的,消息怎么可能到达客户端呢?

  • 如何仅将websocket消息从服务器发送给特定用户? 我的webapp具有Spring Security设置,并使用websocket。我在尝试只从服务器向特定用户发送消息时遇到了一个棘手的问题。 从阅读手册中我的理解是从服务器上我们可以做到的 在客户端: 但是我永远无法调用订阅回调。我尝试了许多不同的道路,但没有运气。 如果我将它发送到/topic/reply,它会工作,但所有其他连接的用户也

  • 有人有任何示例代码来演示在java客户端接收消息socket.io? 还有,有没有从同一个套接字发送文件/二进制文件/图片的例子。io java客户端?(基本上是来自java而非javascript客户端的示例代码) android java client的版本可以在这里获得(该版本声称它可以与socket.io 1.0及更高版本一起使用)(似乎是最新的版本)https://github.com/