Преместете друг потребител в стая с 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. Тогава следващият играч, който поиска да се присъедини към съответното ниво, ще бъде сдвоен с ID на играча, който е .push()'от масива, съответстващ на това ниво.   -  person 728883902    schedule 10.09.2017
comment
Ако трябваше да идентифицирам играчите с техния сокет ID, за да направя нещата по-лесни... Ако вместо това запазя това в масива, как бих могъл да накарам този сокет ID да се присъедини към стаята? socket.join('room'); ще накара настоящия потребител да се присъедини към стаята, но този въпрос се отнася до преместване на друг потребител. Мога да сложа целия код на Pastebin, ако все още не е ясно. Оценявам помощта! :-)   -  person 728883902    schedule 10.09.2017


Отговори (2)


Според вашия коментар

Ако вече няма играчи в обекта pendingPlayers за съответното ниво, потребителят, който се присъединява към игра, се добавя към обекта pendingPlayers.

Вместо да се местите към обект, направете нова стая само с този играч за това ниво. Сега, когато дойде нов играч според вашия коментар

Тогава следващият играч, който поиска да се присъедини към съответното ниво, ще бъде сдвоен с ID на играча, който е .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