Вам нужен какой-то способ, чтобы отслеживать, какие клиенты находятся в лобби вместе. Вы можете сделать это с помощью простого глобального массива, такого как process.lobby[1] = Array(ClientASocket, ClientBSocket)
или чего-то подобного (возможно, с некоторыми дополнительными данными, такими как псевдонимы и тому подобное), где ClientXSocket
- это объект сокета каждого подключаемого клиента.
Теперь вы можете подключить идентификатор лобби (в данном случае 1) к каждому объекту сокета клиента. Это своего рода переменная сеанса (без хлопот идентификаторов сеансов), если хотите.
// i just made a hashtable to put all the data in,
// so that we don't clutter up the socket object too much.
socket.sessionData['lobby'] = 1;
То, что это позволяет вам также сделать, это добавить обработчик событий в объекте сокета, чтобы при отключении клиента сокет мог немедленно удалить себя из массива лобби и отправить сообщение остальным клиентам что этот клиент отключился.
// see link in paragraph above for removeByValue
socket.on('close', function(err) {
process.lobby[socket.sessionData['lobby']].removeByValue(socket);
// then notify lobby that this client has disconnected.
});
Я использовал socket
вместо net.Stream
или request.connection
или чего бы то ни было.
Запомните в HTTP, если у вас нет соединений keep-alive, это закроет TCP-соединение, и, конечно, клиент не сможет оставаться в лобби. Если вы используете простое TCP-соединение без HTTP сверху (скажем, внутри приложения Flash или WebSockets), то вы сможете сохранить его открытым, не беспокоясь о сохранении активности. Есть и другие способы решения этой проблемы, кроме того, что я показал здесь, но я надеюсь, что вы хотя бы начали. Ключ хранит постоянный объект для каждого клиента.
Отказ от ответственности: я не эксперт Node.js. Надеюсь, это как-то полезно.