2013-12-25 4 views
9

Я оцениваю PeerJS, чтобы реализовать простую двухпользовательскую онлайн-игру. Похоже, что когда я передаю id соединения одного игрока другому, они могут открыть канал через PeerJS и хорошо идти.Обнаружение широковещательной или одноранговой сети с помощью PeerJS

Но если два игрока хотят играть, которые не знают друг друга, что является самым элегантным способом сделать там матч? Есть ли способ спросить у брокера PeerJS список всех подключенных клиентов, возможно, с некоторыми метаданными (например, «статус: хочет играть»)? Или это способ транслировать для всех клиентов?

ответ

17

Используя PeerServer, вы можете взять два события, connection и disconnect. С его помощью вы можете создать внутренний список, из которого вы сможете захватить приложение.

Частичный пример:

var PeerServer = require('peer').PeerServer; 
var server = new PeerServer({port: 9000, path: '/myapp'}); 
var connected = []; 
server.on('connection', function (id) { 
    var idx = connected.indexOf(id); // only add id if it's not in the list yet 
    if (idx === -1) {connected.push(id);} 
}); 
server.on('disconnect', function (id) { 
    var idx = connected.indexOf(id); // only attempt to remove id if it's in the list 
    if (idx !== -1) {connected.splice(idx, 1);} 
}); 
someexpressapp.get('/connected-people', function (req, res) { 
    return res.json(connected); 
}); 

Затем, в вашем коде вы клиентский можно AJAX /connected-people и использовать этот список.

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

Надеюсь, это поможет!

EDIT На момент написания данного сообщения было названо connect. Теперь он называется connection.

(Также я теперь буду играть с PeerJS монетой шесть часов. Я надеюсь, вы понимаете, что вы сделали.)

+6

@ZekeSonxx 'Object.keys (server._clients.peerjs);' тот же массив –

+2

Вы также можете передать опцию 'allow_discovery: true' при создании одноранговый сервер. Затем просто используйте метод «peer.listAllPeers» в браузере. Я думаю, что это не документировано на веб-сайте peerjs. – sousa

+0

Я редактировал в 'indexOf' проверках, потому что сетевые события ненадежны, поэтому нам может быть не хватать одного или двух. С помощью дополнительных проверок прослушиватели событий становятся [idempotent] (https://en.wikipedia.org/wiki/Idempotence). –

0

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

var express = require('express'); 
var app = express(); 
var server = require('http').createServer(app); 
var ExpressPeerServer = require('peer').ExpressPeerServer; 
var expressPeerServer = ExpressPeerServer(server, {}); 
app.use('/peerjs', expressPeerServer); 
expressPeerServer.on('connection', function (id) { 
    // the rest is the same as accepted answer 
}); 
Смежные вопросы