如何使用 socket.io-p2p 在房间内建立对等连接?

Posted

技术标签:

【中文标题】如何使用 socket.io-p2p 在房间内建立对等连接?【英文标题】:How do I establish a peer connection inside a room with socket.io-p2p? 【发布时间】:2018-03-18 04:09:40 【问题描述】:

我正在使用数组存储我的连接,并且我有一个按钮(此处未包含),单击该按钮时,会将前两个连接放置在房间内。 我想在这两者之间建立 p2p 连接并通过 p2p 传输一些随机文本或警报。 有人知道我应该怎么做吗? 请注意,我在 html 中加载了 socket.io-p2p 脚本,因此在这种情况下我不必使用 browserify。

客户端文件:

<html>

    <head>
        <script src="/socket.io/socket.io.js"></script>
        <script src="http://localhost:8000/js"></script>

        <script src="https://code.jquery.com/jquery-1.11.1.js"></script>
        <script>
            var socket = io('http://localhost:8000');



            var p2p = new P2P(socket);




            socket.on('C1Trigger', function (data) 
                document.getElementById("A").style.backgroundColor = "green";
            );

            socket.on('C2Trigger', function (data) 
                document.getElementById("A").style.backgroundColor = "green";
            );

            socket.on('C1BYellowTrigger', function (data) 
                document.getElementById("B").style.backgroundColor = "yellow";
            );

            socket.on('C2BGreenTrigger', function (data) 


                document.getElementById("B").style.backgroundColor = "green";


            );

        </script>
    </head>

    <body>
        <div id="A">A</div>
        <div id="B">B</div>

    </body>
    <style>
        div 
            background-color: #FF0000;
            border: none;
            color: white;
            padding: 30px 60px;
            text-align: center;
            text-decoration: none;
            display: inline-block;
            font-size: 60px;
        
    </style>

    </html>

server.js

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var port = process.env.PORT || 8000;
//P2P Requirements
var p2p = require('socket.io-p2p-server').Server;
io.use(p2p);

app.get('/', function (req, res) 
  res.sendFile(__dirname + '/client.html');
);

app.get('/js', function (req, res) 
  res.sendFile(__dirname + '/socketiop2p.min.js');
);






clients = [];
clientSockets = [];






io.on('connection', function (socket) 

  clientSockets.push(socket);




  console.log('Client: ' + socket.id + ' connected.');



  clients.push(socket.id);
  io.sockets.emit('clients', clients);
  // console.log(clients);


  socket.on('executeC1', function () 
    console.log('C1 in MainRoom pinged!');
    io.to(clients[0]).emit('C1Trigger');

  );

  socket.on('executeC2', function () 
    console.log('C2 in MainRoom pinged!');
    io.to(clients[1]).emit('C2Trigger');
  );

  socket.on('greenifyBC2', function () 
    io.to(clients[1]).emit('GreenifyTrigger');
  );

  socket.on('executeC1C2', function (data) 


    console.log('C1C2 in MainRoom pinged!');

    clientSockets[0].join('room C1C2', () => 
    //expand with features
    );
    clientSockets[1].join('room C1C2', () => 
    //expand with features
    );


    io.to(clients[0]).emit('C1BYellowTrigger');

    io.to(clients[1]).emit('C2BGreenTrigger');




    console.log(io.sockets.adapter.rooms);



  );




  socket.on('disconnect', function () 

    console.log('Client: ' + socket.id + ' disconnected');

    var index = clients.indexOf(socket.id);

    if (index > -1) 
      clients[index] = undefined;
    
    console.log(clients);

  );
);

http.listen(port, function () 
  console.log('listening on *:' + port);
);

【问题讨论】:

【参考方案1】:

我会使用您的 socket.io 房间为 webrtc 建立信号。然后我会使用webrtc 进行p2p 连接。

【讨论】:

【参考方案2】:

老问题,但我想弄清楚同样的事情。根据documentation,诀窍是使用告诉 P2P 服务器在服务器代码的 on('connection') 中为新连接的套接字在房间中做信号:

io.on('connection', function(socket) 
  clients[socket.id] = socket
  var room = findOrCreateRoom() //create a room (needs a property called name)
  socket.join(room.name) // join the socket
  
  p2pserver(socket, null, room) //tell the P2P server to have that socket signal to other
  // sockets in the room and not on the common namespace.
)

希望这将帮助人们找到文档的那部分。

我试图弄清楚如何仅在人们进入房间后才开始发出信号。所以不是立即连接。不知道如何“暂停”信号...

更新 socket.io-p2p https://github.com/socketio/socket.io-p2p 不再维护,因此不再与所需的 npm 包兼容。使用另一个 P2P 库。

【讨论】:

以上是关于如何使用 socket.io-p2p 在房间内建立对等连接?的主要内容,如果未能解决你的问题,请参考以下文章

无线 P2P。通知所有可用的对等点某些事件

使用 socket.io 时如何获取房间内的客户端数量?

Unity Photon PUN RPC 只能在房间内使用?

在基于文本的游戏中,如何将对象放置在房间内?

删除房间内数据库

即时通讯IM系统开发