【问题标题】:Socket.io join another client to a roomSocket.io 将另一个客户端加入房间
【发布时间】:2019-03-16 21:33:30
【问题描述】:

我的目标是当 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 也添加到同一个房间?

【问题讨论】:

  • 你试过for循环了吗?
  • 我没有。实际上,我不知道如何将 '.join' 函数与特定的 'socket.id' 一起使用,我可以在数组中获取它。
  • 这可能会有所帮助:stackoverflow.com/questions/40367765/…
  • 本主题介绍如何正确加入房间。但我的问题是,我无法通过 A 用户的操作加入 B 用户:/
  • 您找到解决方案了吗?我也面临同样的问题

标签: javascript node.js socket.io


【解决方案1】:

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

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

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

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

最后加入房间。

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

【讨论】:

    【解决方案2】:

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

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

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

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

    要离开频道,您调用 leave 的方式与加入相同。

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

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

    【讨论】:

    • 加入A侧房间没有问题。问题是,在 A 用户创建并加入该房间后,我如何在不采取任何操作的情况下加入 B 用户?
    【解决方案3】:

    也许在服务器端处理它?有一个存储 User Id 和 Socket Id 的字典,你可以存储这些信息io.on("connection")。然后,当用户 A 执行创建房间的过程时,将房间 id 和标识用户 B 的内容发送到服务器端。服务器端计算出用户 B 的套接字 id 并将它们加入房间。

    【讨论】:

    • 我有一个包含用户及其套接字 ID 的数组。因此,当用户 A 创建房间时,我已经知道 B 的套接字 ID。我怎样才能将用户 B 加入那个房间?用户通过 socket.join('room') 加入该房间。像 socketIDForB.join('room') 那样工作吗?
    【解决方案4】:

    这种方法有点小技巧,但它确实允许您在获得其套接字 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') 如此轻松地添加或删除自己时,这可能看起来毫无意义;但在种情况下,您可能需要从连接的套接字外部执行此操作,例如游戏功能。

    【讨论】:

      猜你喜欢
      • 2012-06-06
      • 1970-01-01
      • 2014-08-26
      • 2017-05-22
      • 1970-01-01
      • 2018-12-01
      • 2015-01-05
      • 2020-10-28
      • 2014-07-18
      相关资源
      最近更新 更多