2010-07-28 5 views
0

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

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

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

ответ

1

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

Что это позволяет сделать также, это добавить крюк событий в объекте сокета, так что, когда клиент отключается, сокет может remove itself from the lobby array сразу, а сообщение остальных клиентов, что клиент отключился.

// 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, если у вас нет подключений по подключению к сети, это приведет к закрытию соединения TCP, и, следовательно, клиент не сможет оставаться в фойе. Если вы используете обычное TCP-соединение без HTTP сверху (скажем, в приложении Flash или в WebSockets), вы должны иметь возможность держать его открытым, не беспокоясь о том, чтобы оставаться в живых. Есть другие способы решить эту проблему, чем то, что я показал здесь, но я надеюсь, что вы, по крайней мере, начали. Ключ сохраняет постоянный объект для каждого клиента.

Отказ от ответственности: Я не эксперт Node.js (я еще не успел его установить), но я читал об этом, и я очень хорошо знаком с браузером js, Я надеюсь, что это будет полезно как-то.

Смежные вопросы