Частные сообщения через node.js - PullRequest
0 голосов
/ 28 июля 2010

Я делаю многопользовательскую (2 игрока) браузерную игру на JavaScript.Каждый ход игрока будет отправлен на сервер и проверен перед передачей противнику.Поскольку WebSockets еще не готова к прайм-тайму, я смотрю на длинные опросы как на способ передачи данных, а node.js выглядит довольно интересно!Я просмотрел несколько примеров кода (примеры чата, стандартные длинные примеры опросов и тому подобное), но все примеры, которые я видел, похоже, передают все каждому клиенту, чего я надеюсь избежать.Для общих серверных сообщений это нормально, но я хочу, чтобы два игрока могли выстроиться в лобби или около того и перейти в режим «личных сообщений».

Так что мне интересно, есть ли способ реализовать приватныйобмен сообщениями между двумя клиентами с использованием nodejs в качестве проверочного моста?Как то так:

ClientA->nodejs: REQUEST
nodejs: VALIDATE REQUEST
nodejs->ClientA: VALID
nodejs->ClientB: VALID REQUEST FROM ClientA

1 Ответ

1 голос
/ 31 июля 2010

Вам нужен какой-то способ, чтобы отслеживать, какие клиенты находятся в лобби вместе. Вы можете сделать это с помощью простого глобального массива, такого как 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. Надеюсь, это как-то полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...