【问题标题】:peer.js / webrtc - how to setup a super simple data connection?peer.js / webrtc - 如何建立一个超级简单的数据连接?
【发布时间】:2021-03-12 23:07:58
【问题描述】:
我的情况是,我需要在位于同一网络的两台计算机之间建立一个双向信号通道。它实际上只是来回发送“ping”。两台计算机可以被视为具有相同的特权。
我试图使用 peer.js 抽象的 webrtc 来打开一个简单的数据通道。我想尽可能在两个客户端上使用相同的代码。
理想的解决方案是:两个用户可以访问网站并自动连接在一起,而无需选择要连接的 ID/远程 ID。
我不明白:是否需要专门指定呼叫者/听众,或者双方可以开始连接?谁能指出这种连接的最简单实现?我正在为他们的服务器使用免费的开发密钥来运行连接代理。谢谢!
【问题讨论】:
标签:
javascript
webrtc
peerjs
【解决方案1】:
如果您托管自己的 PeerJS 服务器(这在 heroku 上非常简单,他们的 repo 上有一个“部署到 heroku”按钮),您可以使用它来获取所有已连接对等点的列表.
listAllPeers(function cb(list){...});
它发送所有已连接对等点的列表,您可以编写一个随机发生器以返回一个 ID 并将这些对等点连接在一起。您还可以在屏幕上填充列表并让用户选择其中任何一个。在这种情况下,peer id 由服务器自动为您生成。
【解决方案2】:
使用 peer.js,您必须知道要连接的对等方的连接 ID。这意味着您需要一些服务器端逻辑来代理连接。
如果你总是想连接最新的两个传入客户端,你可以简单地从 1 作为 id 开始,尝试构造 Peer,当它失败时,增加 id 并重试。然后,如果你用奇数成功了,什么也不做,当你用偶数成功时,打开一个到 yourid - 1 的连接并开始使用这个连接:
// Use id prefix so we don't collide with other users on peer cloud server
let id_prefix = 'quarnos-';
let id = 0;
let peer = null;
let connection = null;
// Try to initialize peer using incrementing id
do {
id++;
peer = new Peer(id_prefix + id);
} while (!peer);
// When someone connects to us, save connection and log message
peer.on('connection', function(incoming_connection) {
incoming_connection.on('data', function(data){
if (!connection) {
connection = incoming_connection;
connection.send('connection established');
}
console.log(data);
// Here you could put some timed connection.send() logic to make it go back and forth between peers, as requested in the OP
});
});
// A peer with an even id tries to connect to the peer with id one lower (peer 2 connects to peer 1, etc.)
if (id % 2) {
let connection = peer.connect(id_prefix + (id - 1));
connection.on('open', function(){
console.log('trying to establish connection to ' + id_prefix + (id - 1));
connection.send('connection opened by ' + (id_prefix + id));
});
}
这应该在对等体 2 上打印 trying to establish connection to quarnos-1 和 connection established 在对等体 1 上打印 connection opened by quarnos-2。
显然它不是很健壮,只是一个最小的例子,展示了如何连接两台计算机的快速而肮脏的方式。您应该真正实现一些管理连接的服务器端逻辑,并可能将连接 ID 存储在 cookie 中,以便您可以在页面重新加载时重新连接到同一个对等点。