【问题标题】:Broadcast or peer discovery with PeerJS使用 PeerJS 进行广播或对等发现
【发布时间】:2013-12-25 19:10:26
【问题描述】:

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

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

【问题讨论】:

    标签: javascript p2p webrtc peerjs


    【解决方案1】:

    使用PeerServer,您可以获取两个事件,connectiondisconnect。使用它,您可以创建一个内部列表,然后您可以让您的应用程序从中获取。

    部分示例:

    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 大约六个小时。我希望你意识到你做了什么。)

    【讨论】:

    • @ZekeSonxx Object.keys( server._clients.peerjs ); 同一个数组
    • 创建对等服务器时也可以传递选项allow_discovery: true。然后只需在浏览器中使用方法peer.listAllPeers。我认为这在 peerjs 网站上没有记录。
    • 我在indexOf 检查中进行了编辑,因为网络事件不可靠,因此我们可能会错过一两个。添加检查后,事件侦听器变为idempotent
    • 这里有关于 peer.listAllPeers() 的更多信息:github.com/peers/peerjs/issues/173 该方法使用回调:peer.listAllPeers((allPeers)=> { console.log(allPeers) })
    【解决方案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
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 2010-10-10
      • 2016-07-30
      • 1970-01-01
      相关资源
      最近更新 更多