我的目标是当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添加到同一会议室?
答案 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')轻松地添加或删除自身时,这似乎毫无意义。但是在某些情况下,您可能需要从连接套接字的外部进行此操作,例如游戏功能。