如何实现向某些用户而不是所有套接字发送消息

How to implement sending messages to some user not to all sockets

如何根据用户名或 ID 向房间中的所有客户端、默认房间中的特定用户发送消息。我需要在哪里实现它,仅在服务器站点上还是?我知道我做错了,我很困惑。

var numUsers = 0;

io.on('connection', (socket) => {
  var addedUser = false;

  // when the client emits 'new message', this listens and executes
  socket.on('new message', (data) => {
    // we tell the client to execute 'new message'
    socket.broadcast.emit('new message', {
      username: socket.username,
      message: data
    });
  });

我在文档中看到代码 https://socket.io/docs/rooms-and-namespaces/ 以及如何处理用户的 ID,他们在每次重新连接时都发生了变化

您可以执行以下操作:

1.You可以使用自己的数据结构来存储用户信息,如socketId等,或者使用redis,这是一个很好的内存数据结构。

2.You 当使用上述任何一种或其他方法在服务器上建立新连接时,必须为每个用户存储 socketId。

3.when 您想将消息发送给特定用户,您需要拥有它的 socketId 并使用此代码发送消息:

 io.to(`${socketId}`).emit('hey', 'How are you');

4.When 用户断开连接只是删除用户的信息,如 socketId 和您拥有的其他信息。

因此,当用户加入您的服务器时保存他的信息,当他离开时将其删除。

现在假设您的服务器上连接了四个用户。只需创建一个对象数组来跟踪用户和套接字 ID。当新用户连接时,只需推入数组,当用户退出时,只需循环遍历数组,当 socketId 匹配时,只需从数组中删除该对象 simple

 let users = [{name:'a',id:'socketId'},{name:'b',id:'socketId'},{name:'c',id:'socketId'},{name:'d',id:'socketId'}]

如果你只想向用户 b 发送消息,只需循环遍历数组并匹配名称 属性,当你找到匹配的名称时,只需获取该用户的 ID 并将其发送出去

for(let i=0 ; i<users.length ; i++){
     if(users[i].name == 'b'){
        io.to(users[i].id).emit('hey', 'How are you');
     }
}

每个连接都有一个套接字 ID,但每次用户在浏览器上打开一个新选项卡时它都会不同。因此,如果用户打开两个选项卡,他们将有两个不同的 socketId。

所以更好的方法是使用房间。每次用户连接时,您都可以将其添加到房间。房间名称可以是userId或email。

socket.join(userid)

然后,每当您想向特定用户发送消息时,只需使用

io.sockets.in(userid).emit('message',"hello");

即使用户在他们的设备上打开了多个标签页,这仍然有效。