10

我正在评估PeerJS以实现一个简单的两人在线游戏。似乎一旦我将id一个玩家的连接转移到另一个玩家,他们就可以通过 PeerJS 打开一个频道并且很高兴。

但是如果两个不认识的玩家想要玩,那么在那里进行匹配的最优雅的方式是什么?有没有办法向 PeerJS 代理询问所有已连接客户端的列表,可能附带一些元数据(例如“status:wants-to-play”)?或者有没有办法向所有客户广播?

4

2 回答 2

22

使用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并使用该列表。

对于元数据,您可以扩展上面的代码以添加用户状态和更新该状态的方式。

希望这可以帮助!

编辑在撰写本文时,该事件被命名为connect. 它现在被命名为connection.

(另外我现在要玩 PeerJS 大约六个小时。我希望你意识到你做了什么。)

于 2014-03-09T11:49:45.733 回答
2

以防万一,如果这对某人有帮助,如果您将 PeerJS 与 express 服务器结合使用,则如下所示:

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
});
于 2016-01-29T18:30:46.737 回答