Socket.io将另一个客户端加入房间

时间:2019-03-16 21:33:30

标签: javascript node.js socket.io

我的目标是当A用户单击B用户时,他们将加入一个房间。我在为所有客户端提供数组的socket.id。

//CLIENT SIDE FOR A//
$('.chat-start').on('click', function(event) {
        event.preventDefault();
        var room_id = '72xaz132s'
        var target_id = $('.target').data('id');
        socket.emit('force join room', room_id, target_id);
    });

//SERVER SIDE FOR A AS AN EXAMPLE//

var clients {'customIDA' : socket.id for a, 'customIDB' : socket.id for b}

socket.on('force join room', function (roomid, customIDB) { 
        socket.join(chat_id); //CLIENT A JOINS ROOM//
    })

客户端A可以毫无问题地加入会议室,但是我又如何将客户端B添加到同一会议室?

4 个答案:

答案 0 :(得分:0)

您可以调用join将套接字订阅到给定频道:

// On connection join room
io.on('connection', function(socket){
  socket.join('ROOM ID');
});

然后在广播或发射时简单地使用to或in(它们相同):

io.to('some room').emit('some event');

要退出频道,您呼叫离开的方式与加入相同。

文档:https://socket.io/docs/rooms-and-namespaces/

function join() {
 // Run's once clicked
 console.log('Join function here');
}
<a href="#" onclick="join()">Join</a>

答案 1 :(得分:0)

也许可以在服务器端处理它?有一个存储用户ID和套接字ID的字典,您可以存储此信息io.on("connection")。然后,当用户A完成创建房间的过程时,将房间ID和标识用户B的内容发送到服务器端。服务器端找出用户B的套接字ID并将其加入房间。

答案 2 :(得分:0)

io.on("connection")中,您可以将具有用户ID的套接字对象存储为对象

{"socket": socket, "id": user_id}

要数组。然后从数组中找到索引:

let user_index = users.findIndex(user => user.id == user_id);

最后加入房间。

let socketB = users[user_index].socket;
socketB.join('room');

答案 3 :(得分:0)

此方法有点麻烦,但是它确实允许您在拥有套接字ID的情况下,将所有指定的套接字强制完全移入服务器端的房间,而无需维护其他对象数组。 SocketIO(v2.x)在两个位置存储房间分配以使事情变得有趣。

// $targetSocket is the socket ID of the connection you want to force into a room
    
$roomArray = $io->sockets->connected[$targetSocket]->rooms; //socket's rooms stored here
$roomArray[$newRoom] = $newRoom; // add the new room to this array
$io->sockets->connected[$targetSocket]->rooms = $roomArray; // save the modified array
$io->sockets->adapter->add($targetSocket, $newRoom); // update the adapter too

这显然是PHP,但可以轻松转换为js。

您也可以执行相反操作以将用户踢出房间:

unset($roomArray[$oldRoom]); //delete room key and value from this socket's array
// save the array here, see above
$io->sockets->adapter->del($targetSocket, $oldRoom); // delete from adapter

同时使用这两个系统进行请假和加入。

当套接字可以使用socket-> join('ROOM')轻松地添加或删除自身时,这似乎毫无意义。但是在某些情况下,您可能需要从连接套接字的外部进行此操作,例如游戏功能。