Переместите другого пользователя в комнату с помощью Socket.io

Я использую Socket.io с Node.js, и я хотел бы объединить пользователей и отправить их в новую комнату.

Когда пользователь подключается, в io.on('connection') я определяю его совместимость с пользователем, ожидающим объединения в массив.

Если присоединившийся пользователь совместим с ожидающим пользователем, я хочу переместить их обоих в новую комнату.

Это мой текущий подход. Примечание. [1029387,1983934,9243802] — это массив идентификаторов пользователей.

var pendingPlayers = {
    "spelling": {
        "level1":[1029387,1983934,9243802],
        "level2":[]
     }
}


io.on('connection', function(socket) {
    // check compatibility
    // move current player and other queued player to new room
});

Единственная идея, которая у меня есть, это socket.emit('room', 'new room name'); от сервера к клиенту, чтобы игрок в очереди отправил этот идентификатор обратно на сервер, а затем использовал:

io.on('connection', function(socket) {
    socket.on('room', function(room) {
        socket.join(room);
    });
});

Однако отправка имени комнаты клиенту, чтобы затем отправить его обратно на сервер, кажется ужасно надуманной. Я надеюсь, что есть более простой способ.

Ваши предложения с благодарностью принимаются.


person 728883902    schedule 09.09.2017    source источник
comment
Зачем посылать номер клиенту с сервера? Просто переместите клиента прямо в эту комнату с сервера. Не нужно просить клиента помочь вам в этом.   -  person jfriend00    schedule 09.09.2017
comment
Спасибо, jfriend00, но мне нужно переместить другого пользователя в другую комнату (не того пользователя, о котором идет речь). Надеюсь, это имеет смысл?   -  person 728883902    schedule 09.09.2017
comment
Нет никаких причин, по которым вы не можете просто сделать это с сервера в любой момент — для любого пользователя, который в данный момент подключен к вашему серверу. Какую информацию вы используете для идентификации ваших пользователей?   -  person jfriend00    schedule 09.09.2017
comment
Я намерен использовать уникальный идентификатор пользователя для идентификации пользователей, хотя я еще не зашел так далеко.   -  person 728883902    schedule 10.09.2017
comment
Что ж, похоже, у нас недостаточно информации, чтобы понять, как на данный момент вы знаете, каких двух пользователей вы хотите поместить в одну и ту же комнату, как вы получите сокет для обоих этих пользователей. Нам нужно было бы увидеть код, где это происходит, чтобы узнать, какая информация доступна, или нам нужно рекомендовать сохранить новый тип структуры данных, чтобы иметь возможность идентифицировать сокеты. Если вы используете socket.id в качестве идентификатора, тогда socket.io позволит вам искать сокет непосредственно из него.   -  person jfriend00    schedule 10.09.2017
comment
Спасибо за указание на это, я согласен, что должен был лучше объяснить контекст. В объекте есть два ключа - level1 и level2. Пользователи находятся в паре на одном уровне с другим игроком. Если в объекте pendingPlayers для соответствующего уровня уже нет игроков, пользователь, присоединяющийся к игре, добавляется в объект pendingPlayers. Затем следующий игрок, который запрашивает присоединение к соответствующему уровню, будет связан с идентификатором игрока, полученным с помощью .push() из массива, соответствующего этому уровню.   -  person 728883902    schedule 10.09.2017
comment
Если бы я должен был идентифицировать игроков по их идентификатору сокета, чтобы упростить задачу... Если бы я вместо этого сохранил это в массиве, как я мог бы заставить этот идентификатор сокета присоединиться к комнате? socket.join('room'); заставит текущего пользователя присоединиться к комнате, но этот вопрос относится к перемещению другого пользователя. Я могу выложить весь код на Pastebin, если все еще неясно. Я ценю помощь! :-)   -  person 728883902    schedule 10.09.2017


Ответы (2)


Согласно вашему комментарию

Если в объекте pendingPlayers для соответствующего уровня уже нет игроков, пользователь, присоединяющийся к игре, добавляется в объект pendingPlayers.

Вместо того, чтобы двигаться к объекту, создайте новую комнату только с этим игроком для этого уровня. Теперь, когда новый игрок приходит согласно вашему комментарию

Затем следующий игрок, который запрашивает присоединение к соответствующему уровню, будет связан с идентификатором игрока, полученным с помощью .push() из массива, соответствующего этому уровню.

заставить следующего игрока присоединиться к комнате выше.

person Anuj Nautiyal    schedule 11.09.2017

Может быть, вам нужна логика, как в игре с линкором. Используется временная «зал ожидания». Я нашел его здесь: https://github.com/inf123/NodeBattleship/blob/master/server.js

io.on('connection', function (socket) {

  //firstly add player to room until opponent aren't come
  socket.join('waiting room');

  joinWaitingPlayers();
});

function joinWaitingPlayers () {
  var clients = [];
  for (var id in io.sockets.adapter.rooms['waiting room']) {
    clients.push(io.sockets.adapter.nsp.connected[id]);
  }

  if (clients.length >= 2) {
    //if we have a couple, then start the game
    var game = new Game();

    // live "waiting room"
    clients[0].leave('waiting room');
    clients[1].leave('waiting room');
    // and then join both to another room
    clients[0].join('game' + game.id);
    clients[1].join('game' + game.id);

  }
}

person dimaqw    schedule 11.09.2017