Peerjs: 在 node.js 应用程序中运行 peerjs 客户端?

创建于 2013-11-06  ·  65评论  ·  资料来源: peers/peerjs

是否可以在 node.js 应用程序而不是浏览器中运行 peer.js 客户端?

我正在创建一个对等网络,该网络由生活在浏览器和 node.js 应用程序中的(编程)对等点组成。 他们必须互相发送数据,没有视频/音频。 WebRTC 将是一个很好的解决方案,可以解决对等点之间的路由和通信,而不需要集中的客户端/服务器结构。 但是 WebRTC 似乎只在浏览器中得到支持。

另请参阅此问题: http ://stackoverflow.com/questions/18872712/node-js-webrtc-client

最有用的评论

概述
嗨,我看到这是旧的,但你或任何人可能需要这个。 我正在写我的论文,我已经取得了一些进展。 我已经尝试了很多东西,simplepeer 没有实现任何信号。 通过数据通道(nodejs peerjs webrtc)发送消息 - 在 Raspberry Pi 2(ARM,Raspbian Jessie,但应该在任何地方都可以使用)上使用部署的信令服务器(peerserver)现在可以正常工作。 另一个客户端是windows环境下的firefox浏览器。 如果没有你在这里的讨论,我不会成功,所以我回馈社区。

关于做什么(不做什么)的关键事项:
- 不要使用硒,它不够快,至少对于我的应用程序
-xvfb 对我没用,很好
- 你不能需要 peerjs 模块
- 至少在 Raspberry 上 - 使用 electron-webrtc,因为 wrtc 无论如何都不适用于 arm
-不要使用序列化

必须自己做所有事情都很难,所以这里是代码:
窗口 = 全局
window.BlobBuilder = 要求(“BlobBuilder”)
位置 = {协议:'http'}

BinaryPack = 要求(“二进制包”)
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var wrtc = require('electron-webrtc')()
//var Peer = require('peerjs')

RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSessionDescription;
RTCIceCandidate = wrtc.RTCIceCandidate;

WebSocket = 要求('ws')
要求('/home/pi/node_modules/peerjs/lib/exports.js');

var 对等 = 新对等(
...
})

var conn=peer.connect('id')
conn.serialization='无'
conn.send('来自nodejs的你好!')

就是这样,问候,JP

所有65条评论

我发现@helloIAmPau发起了一项创建WebRTC 的node.js 实现的倡议: https://github.com/helloIAmPau/node-rtc/。 也许可以捆绑力量?

嘿乔斯,

我会留意的。 当有可靠的 webrtc 节点客户端时
移植 peerjs 应该是微不足道的。

2013 年 11 月 6 日星期三上午 6:46,Jos de Jong [email protected]写道:

我发现了@helloIAmPau https://github.com/helloIAmPau发起的一项倡议
创建 WebRTC 的 node.js 实现:
https://github.com/helloIAmPau/node-rtc/。 也许可以捆绑
军队?


直接回复此邮件或在 Gi tHub上查看 https://github.com/peers/peerjs/issues/103#issuecomment -27878686
.

510-691-3951
http://ericzhang.com

参见https://github.com/modeswitch/node-webrtc 。 我认为 node-rtc 正在被它取代。

谢谢埃里克,那太好了。

这也将使 node.js 应用程序作为MCU来控制一组对等点(电话会议)的视频/音频流,如 Justin Uberti在 WebRTC 上的最后一次 Google I/O 中所解释的星型架构(从 23 :19)。 Node.js 擅长处理流,因此非常适合。

@ericz关闭此问题的原因是什么? 对 node.js 的支持将非常棒且强大。

嘿,乔斯德容,

我关闭了它,因为没有操作项,但我会重新打开它,以便我们可以密切关注该功能:)

好,谢谢。 随意将标题调整为“node.js support”之类的内容,并给问题一个适当的标签......

:+1: 这将是一个非常有用的功能。

:+1: 也为此投票。

:+1: 非常需要

+1

我设法模拟了一些对象并让 peerjs 在 node.js 上运行

窗口={};
window.BlobBuilder = require("BlobBuilder");
位置={};
location.protocol="http";

BinaryPack = 要求(“二进制包”);
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

var wrtc = 要求(“wrtc”);
RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSessionDescription;
RTCIceCandidate = wrtc.RTCIceCandidate;

WebSocket = 要求('ws');
var peerClient =require("./peer.js");

我设法让 peerjs 建立连接并让服务器获得连接。 但是,当我尝试发送数据时,出现跟随错误

[错误:连接未打开。 您应该在发送消息之前监听open事件。]

这是完整的要点

https://gist.github.com/piyushranjan/1204bc579b7c1f5a3e84

并且必须安装这些 npm 包

npm 安装 BlobBuilder
npm 安装二进制包
npm 安装 ws
npm install xmlhttprequest
npm 安装 wrtc

啊,这真是太棒了! 会看看:)。

米歇尔

2014 年 5 月 6 日星期二上午 7:37,Piyush Ranjan [email protected]写道:

我设法模拟了一些对象并让 peerjs 在 node.js 上运行

窗口={};
window.BlobBuilder = require("BlobBuilder");
位置={};
location.protocol="http";

BinaryPack = 要求(“二进制包”);
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

var wrtc = 要求(“wrtc”);
RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSessionDescription;
RTCIceCandidate = wrtc.RTCIceCandidate;

WebSocket = 要求('ws');
var peerClient =require("./peer.js");

我设法让 peerjs 建立连接并让服务器获得连接。
但是,当我尝试发送数据时,出现跟随错误

[错误:连接未打开。 您应该收听 open 事件
在发送消息之前。]

这是完整的要点

https://gist.github.com/piyushranjan/1204bc579b7c1f5a3e84

并且必须安装这些 npm 包

npm 安装 BlobBuilder
npm 安装二进制包
npm 安装 ws
npm install xmlhttprequest
npm 安装 wrtc


直接回复此邮件或在 Gi tHub上查看 https://github.com/peers/peerjs/issues/103#issuecomment -42292282
.

@michelle有这方面的运气吗? 我试过了,打开连接似乎有效,但从未收到发送的消息。

:+1: 对于这个功能

:+1: 对于这个功能

:+1:

:+1::+1::+1:

我想知道这是什么状态? 如果支持这个会很棒吗?

peerjs 有一个节点模块,但我认为它还不起作用。 当我需要它时,我得到窗口未定义,这是一个公平的反对意见。
https://www.npmjs.org/package/peerjs#readme

所以我很好奇:有什么事吗? 拥有它真是太棒了! ;)

此节点模块用于浏览器代码:)。

米歇尔

2014 年 10 月 23 日星期四上午 11:37,Lixissimus [email protected]
写道:

peerjs 有一个节点模块,但我认为它还不起作用。 当我
要求它,我得到窗口未定义,这是一个公平的反对意见。
https://www.npmjs.org/package/peerjs#readme

所以我很好奇:有什么事吗? 拥有它会很棒
它! ;)


直接回复此邮件或在 GitHub 上查看
https://github.com/peers/peerjs/issues/103#issuecomment -60287567。

那么它应该做什么呢?

我不知道我是否只是对节点感到困惑,但是如果 peerjs 模块本身只能从浏览器中使用,那么有一个用于 peerjs 的 npm 模块似乎很奇怪?

抱歉,这是在我们开始在 bower 上发布图书馆之前。

米歇尔

2014 年 10 月 23 日星期四上午 11:51,Alan Chusei [email protected]
写道:

我不知道我是否只是对节点感到困惑,但似乎很奇怪
peerjs 的 npm 模块,如果 peerjs 模块本身只能从
浏览器?


直接回复此邮件或在 GitHub 上查看
https://github.com/peers/peerjs/issues/103#issuecomment -60289790。

@AChusuei我认为在 npm 中拥有特定于浏览器的库或同构库没有任何问题。 对于我的全栈 JS Web 应用程序,我喜欢只处理 npm,而不是从 npm 获取一半的 Iibraries,从 bower 获取另一半。

@michelle我真的希望 peerjs 能够获得对 node.js 客户端的支持!!

@josdejong ,我想你可以那样做。 我还是节点世界的新手,愿意以不同的方式做事!

:+1:

在解决此问题之前,可能会有无头浏览器的解决方法。 我没有自己测试过它们:

  • phantom.js -> 可能会成功,但我知道他们现在不支持 webrtc
  • 通过 xvfb 启动 chrome,在此处查看更多信息: https ://blog.andyet.com/2014/09/29/testing-webrtc-applications

我会试试第二个。

:+1:

+2^56 的功能!

:+1:

:+1:

:+1:

+1

@piyushranjan发布的 hack 似乎不适用于当前的稳定版本,因为它不会全局导出任何内容(并且所有模块都在一个文件中)。

解决方法似乎是使用非“编译”/连接版本。

因此,克隆存储库,然后执行以下操作:

window = global;
location = {protocol: 'http'};

XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

var wrtc = require("wrtc");
RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSessionDescription;
RTCIceCandidate = wrtc.RTCIceCandidate;

WebSocket = require('ws');

require('./peerjs/lib/exports.js');

var peer = new Peer({
  // snip...
});

特别注意底部附近的require行,它为您处理将所有单独的部分加载到global / window对象中。

仍然是一个讨厌的黑客,但它似乎工作,至少对于非常基本的测试。

注意:同样的警告适用,您仍然需要先安装一些软件包:

npm install BlobBuilder binary-pack ws xmlhttprequest wrtc

@lewiseason您是否真的建立并运行了连接并能够发送一些数据?

到目前为止,我还没有成功。 看起来我可以打开一个连接,但没有创建数据通道。

这是我尝试过的:

  1. 安装

sudo apt-get install libnss3-dev libexpat1-dev npm install peerjs BlobBuilder binary-pack ws xmlhttprequest wrtc

  1. 创建一个 html 文件peer1.html连接一个带有 id 'peer1'的客户端:

``` html



对等体1



```
  1. 创建一个 node.js 脚本peer3.js

``` js
窗口=全局;
window.BlobBuilder = require("BlobBuilder");
位置 = {协议:'http'};

BinaryPack = 要求(“二进制包”);
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

var wrtc = 要求(“wrtc”);
RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSessionDescription;
RTCIceCandidate = wrtc.RTCIceCandidate;

WebSocket = 要求('ws');

要求('peerjs/lib/exports.js');

var peer = new Peer('peer3', {key: 'lwjd5qra8257b9', debug: true});

peer.on('open', function () {
console.log('对等开放');
var conn = peer.connect('peer1');

 conn.on('data', function(data) {
   console.log('Received', data);
 });

 conn.on('error', function (err) {
   console.log('Error', err);
 });

 conn.on('open', function () {
   console.log('connection open');
   conn.send('Hello from ' + peer.id + '!');
 });

});
```

  1. 在浏览器中打开文件peer1.html
  2. 运行 node.js 脚本peer3.js

查看调试输出,看起来peer3成功连接到peer1,但没有建立数据通道:peer1输出“new connection to peer3”,但没有收到任何消息。

恐怕我对它的测试并没有走得太远——科学怪人在生产中使用它似乎有点困难,所以我最终离开了它。 对不起 :(

:+1:

:+1:

这事有进一步更新吗?

@josdejong问题在于信令数据。 报价/答案似乎没有附加 STUN 数据。 如果没有这些数据,就无法建立实际的联系。 以下确实在浏览器和节点之间建立了连接,但没有 peerjs 信号。

https://github.com/cjb/serverless-webrtc

+1

+1

有人要开赏金吗?

由于这已经开放了两年多:是否有任何(其他)已知的包可以在浏览器和节点中运行 P2P?

我没有时间检查它,但https://github.com/feross/simple-peer说它在 node.js 和浏览器中都有效。

这是你要找的吗? https://github.com/socketio/socket.io-p2p

从自述文件:

“这个模块提供了一种简单可靠的方法来设置对等点之间的 WebRTC 连接并使用事件(socket.io-protocol)进行通信。

Socket.IO 用于传输信令数据并作为不支持 WebRTC PeerConnection 的客户端的后备。”

就我而言,它在 Node.js 上不起作用。 这就是我遇到这个线程的原因。

唔。 你可以再详细一点吗? 我现在正在使用它,使用节点服务器连接对等方,然后彼此建立 webRTC 连接和/或节点服务器的机器。

使用节点服务器连接对等点,然后彼此建立 webRTC 连接

因此,您_not_ 将其作为客户端运行。 您在连接 _other_ 客户端的服务器上运行它(您没有提到它们是节点应用程序 - 如果是,我会对您如何设置它们感兴趣)。
该线程是关于在节点应用程序中使用 peerjs(或可能的其他任何东西)作为对等点(客户端)。

webRTC 相互连接和/或节点服务器的机器

第二部分似乎正是这里正在讨论的内容。 其他人可以证实这一点吗?

不,问题是使用 NodeJS 作为 WebRTC客户端。 IE。 从不一定是服务器的 NodeJS 实例连接。

哦,抱歉。 SimplePeer 会这样做。 但是需要服务器平台安装一定的webrtc能力。 'wrtc' 模块在大多数机器上提供此功能。 值得注意的是_not_现在在树莓派上,以防这对你很重要(对我来说很重要!)

他们的 readme.md 片段:

在节点

要在节点中使用此库,请将 opts.wrtc 作为参数传入:

var SimplePeer = require('simple-peer')
var wrtc = 要求('wrtc')

var peer1 = new SimplePeer({ 发起者: true, wrtc: wrtc })
var peer2 = new SimplePeer({ wrtc: wrtc })

+1 这将是一个不错的功能

查看 electron-webrtc 或 webrtc-native。 我为我的 node.js 实例使用 electron-webrtc 来连接浏览器(专门使用数据通道)

概述
嗨,我看到这是旧的,但你或任何人可能需要这个。 我正在写我的论文,我已经取得了一些进展。 我已经尝试了很多东西,simplepeer 没有实现任何信号。 通过数据通道(nodejs peerjs webrtc)发送消息 - 在 Raspberry Pi 2(ARM,Raspbian Jessie,但应该在任何地方都可以使用)上使用部署的信令服务器(peerserver)现在可以正常工作。 另一个客户端是windows环境下的firefox浏览器。 如果没有你在这里的讨论,我不会成功,所以我回馈社区。

关于做什么(不做什么)的关键事项:
- 不要使用硒,它不够快,至少对于我的应用程序
-xvfb 对我没用,很好
- 你不能需要 peerjs 模块
- 至少在 Raspberry 上 - 使用 electron-webrtc,因为 wrtc 无论如何都不适用于 arm
-不要使用序列化

必须自己做所有事情都很难,所以这里是代码:
窗口 = 全局
window.BlobBuilder = 要求(“BlobBuilder”)
位置 = {协议:'http'}

BinaryPack = 要求(“二进制包”)
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var wrtc = require('electron-webrtc')()
//var Peer = require('peerjs')

RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSessionDescription;
RTCIceCandidate = wrtc.RTCIceCandidate;

WebSocket = 要求('ws')
要求('/home/pi/node_modules/peerjs/lib/exports.js');

var 对等 = 新对等(
...
})

var conn=peer.connect('id')
conn.serialization='无'
conn.send('来自nodejs的你好!')

就是这样,问候,JP

@jeryfast ,感谢您的解决方案,我正在寻找类似的东西👍

我在 Mac 上测试它(还没有在树莓上)并且收到错误“无法在 'RTCDataChannel' 上设置 'binary Type' 属性:尚未实现 Blob 支持”

经过一番搜索,发现在文件 utils 上,在第 116 行附近的路径 node_modules/peerjs/lib 上:

try {
        dc.binaryType = 'blob';
        binaryBlob = true;
      } catch (e) {
      }

这导致错误和应用程序崩溃。

如果对代码进行了注释,则该应用程序可以正常工作,并且它就像一个浏览器客户端一样,非常漂亮。 但这是一个肮脏的黑客,所以我一直在寻找一种“配置”或做一些不从库中更改代码的事情,但直到现在我还没有找到任何东西。

挑战在于何时执行该段代码,即在模块加载过程中,当导出的要求完成时:

require('./node_modules/peerjs/lib/exports.js');

有人对如何纠正这个问题有任何想法或建议吗?

问候

很好,如果您使用“无”序列化,它也可以工作,而无需更改库中的任何内容。 问候

再次嗨@jeryfast ,正如你所说,它适用于覆盆子。 我上一篇文章中的问题与 OS X 有关。

好吧,这件事做得很好👍

不,让我们开始乐趣💃

你好
我收到此错误。
```
global.postMessage(messageName, '*');
^

TypeError:global.postMessage 不是函数
在 Object.setZeroTimeoutPostMessage [as setZeroTimeout] (

@crosogf ,在我看来,这个错误就像是一个更大问题的症状。 似乎 postMessage 唯一使用的地方是错误处理代码。 我的猜测是它与 lib/util.js 中的二进制 blob 支持检测有关(代码 @nuno-nlfsoftware 说要注释掉)。 我注意到有两个地方存在代码,在 dist/peer.js 或 dist/peer.min.js 中,以及在 lib/util.js 中。 对我来说,只有对后者的修改是有效的(由于@jeryfast需要 lib/exports.js 的破解)。

此外,连接序列化不必设置为none 。 您可以使用除binary之外的任何其他选项,您只需要设置它,因为二进制是默认值。 我将它设置为json效果很好。

我将把它留在这里https://www.npmjs.com/package/peerjs-nodejs

谢谢,我认为它应该是 PeerJS 的一部分。

这是我测试后的代码jeryfast & peerjs-nodejs

const peerJs = require('peerjs-nodejs');
const peer = peerJs("myPeerId", {
host: '192.168.137.231',
port: 9000,
pingInterval: 5000,
path: '/myapp',
debug: 3, 
iceTransportPolicy: 'relay',
config: {
'iceServers': [
    { urls: "stun:stun.l.google.com:19302" },
    {
        urls: "turn:34.192.149.24:5678?transport=udp",
        username: "USER", credential: "PASS"
    }
]
}
});

let conn = peer.connect('myPeerJS', {
    reliable: true
});


setTimeout(()=>{
 // NOT JSON
 // conn.serialization='none';
 // conn.send('hello from nodejs!');  

 // JSON WAY
 conn.serialization = 'json';
 conn.send({ value: 'hello from nodejs!' });

}, 3000);

setTimeout(()=>{
  conn.close();
  console.log("CONN CLOSE");
  process.exit();
}, 10000);

您好,我在 NodeJS 服务器上创建 Peer 实例(使用peerjs-nodejs )后立即收到此错误。 目前我什至没有创建与远程 Peer 的连接。 有人解决了吗?

服务器.js

const Peer = require('peerjs-nodejs')

...

this.peer = Peer('webRTC-webinar-plugin', {
      host: '/',
      path: 'peer-js',
      port: (useHTTPS) ? 8443 : 8080,
      secure: (useHTTPS) ? true : false
})
/Users/federico/Documents/webRTC-webinar-plugin/node_modules/peerjs-nodejs/node_modules/peerjs/lib/util.js:234

      global.postMessage(messageName, '*');
             ^
TypeError: global.postMessage is not a function
    at Object.setZeroTimeoutPostMessage [as setZeroTimeout] (/Users/federico/Documents/webRTC-webinar-plugin/node_modules/peerjs-nodejs/node_modules/peerjs/lib/util.js:234:14)
    at Peer.disconnect (/Users/federico/Documents/webRTC-webinar-plugin/node_modules/peerjs-nodejs/node_modules/peerjs/lib/peer.js:420:8)
    at Socket.<anonymous> (/Users/federico/Documents/webRTC-webinar-plugin/node_modules/peerjs-nodejs/node_modules/peerjs/lib/peer.js:120:12)
    at Socket.emit (/Users/federico/Documents/webRTC-webinar-plugin/node_modules/peerjs-nodejs/node_modules/eventemitter3/index.js:71:35)
    at exports.XMLHttpRequest._http.onerror (/Users/federico/Documents/webRTC-webinar-plugin/node_modules/peerjs-nodejs/node_modules/peerjs/lib/socket.js:91:12)
    at exports.XMLHttpRequest.dispatchEvent (/Users/federico/Documents/webRTC-webinar-plugin/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:591:25)
    at exports.XMLHttpRequest.handleError (/Users/federico/Documents/webRTC-webinar-plugin/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:533:10)
    at ClientRequest.errorHandler (/Users/federico/Documents/webRTC-webinar-plugin/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:459:14)
    at ClientRequest.emit (events.js:310:20)
    at Socket.socketErrorListener (_http_client.js:426:9)

有人可以帮忙吗? 谢谢。

此页面是否有帮助?
0 / 5 - 0 等级