多次加入同一个房间和一个房间的客户

Posted

技术标签:

【中文标题】多次加入同一个房间和一个房间的客户【英文标题】:Joining same room more then once and clients in a room 【发布时间】:2014-07-18 18:49:47 【问题描述】:

我试图弄清楚如果客户多次发出加入同一个房间会发生什么,为了测试并找到答案,我最初想找出在同一个客户发送多于一个之后有多少客户房间发出加入房间,但 wiki https://github.com/Automattic/socket.io/wiki/Rooms 中的房间章节已过时。当我尝试使用“io.sockets.clients('room')”时,出现错误“Object # has no method 'clients'”。

所以我有两个问题: 1. 如果客户多次尝试加入同一个房间会怎样?每次他尝试加入时,他会得到那个房间的发射吗? 2. 如何知道房间里有哪些客户?

我正在使用 socket.io v1.0.2

【问题讨论】:

【参考方案1】:

我在socket.io github 得到了这个问题的答案。

    根据this 代码行,套接字将只接收一次发射。套接字仅添加到房间一次,如果再次尝试将同一套接字加入房间,则此尝试将被忽略。

    目前没有用于获取客户端的公共 API,#1428 正在进行一些讨论。如果您真的需要获取它们,出于某种原因,您可以从适配器获取实际客户端,假设您没有像这样使用 redis 适配器:

    socket.join('test room');
    var clients = io.sockets.adapter.rooms['test room'];
    console.log(clients);
    for (var clientId in clients) 
      console.log(io.sockets.connected[clientId]);
    
    

【讨论】:

+1 表示无法让客户进入房间。我最终做了你在答案#2 中建议的相同修复 这种忽略是在 Socket.io 0.9 中还是在 1.0 中新出现的?因为如果用户已经加入房间,我喜欢被忽略的想法。 在 v1.3.5 中客户端未定义。 很高兴知道一个套接字只能连接到一个房间,只是在一个项目中测试它。感谢提供代码 sn-p! @NickKenens - 不,一个套接字可以连接到多个房间。答案表明,无论多次尝试加入同一个房间,“发射”只会执行一次【参考方案2】:

修复了在 socket.io ~1.4.5 的房间中获取客户端的问题,如下所示:

    socket.join('test room');
    var room = io.sockets.adapter.rooms['test room'];
    console.log(room);
    for (var socketId in room.sockets) 
      console.log(io.sockets.connected[socketId]);
    

【讨论】:

【参考方案3】:

它工作正常并且没有给出任何错误,它忽略了从已经在房间中的那个套接字加入房间的第二个请求。

我实际上已经尝试并实施了一个解决方案,其中 当用户单击消息通知时,它会加入发出通知的特定房间,并且当他发送第一条消息时,他再次加入该特定房间(这是因为我在 AngularJS 中构建了聊天指令)。

客户端

1) 用户打开通知

Socket.emit('JoinRoomWithThsID', notification.ConversationID);

2) 用户在该房间发送第一条消息

Socket.emit('patientChatRoomMessage', adminmessage);

【讨论】:

以上是关于多次加入同一个房间和一个房间的客户的主要内容,如果未能解决你的问题,请参考以下文章

强制将客户加入房间

在 NestJs 中使用 Socket IO 加入和发射到房间

socket.io 从两个房间加入客户端

Socket.IO 在一个房间内多次发射(与 React.js 一起使用)

玩家可以加入多个房间吗?双关语

如何用一个节加入多个 xmpp 房间?