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)を介したメッセージの送信-デプロイされたシグナリングサーバー(peerserver)を使用したRaspberry Pi 2(ARM、Raspbian Jessie、ただしどこでも機能するはずです)のネットワークを介してメッセージを送信するようになりました。 もう1つのクライアントは、Windows環境のFirefoxブラウザです。 ここでの議論がなければ成し遂げられなかったので、コミュニティに還元します。

何をすべきか(すべきでないか)についての重要なこと:
-少なくとも私のアプリケーションでは、セレンを使用しないでください。十分な速度ではありません。
-xvfbは私にとってはうまくいきませんでした、まあそれはうまくいきました
-peerjsモジュールは必要ありません
-少なくともRaspberryでは-とにかくwrtcはarmに使用できないため、electron-webrtcを使用します
-シリアル化を使用しないでください

すべてを自分で行うのは難しいので、コードは次のとおりです。
ウィンドウ=グローバル
window.BlobBuilder = require( "BlobBuilder")
location = {プロトコル: 'http'}

BinaryPack = require( "binary-pack")
XMLHttpRequest = require( "xmlhttprequest")。XMLHttpRequest;
var wrtc = require( 'electron-webrtc')()
// var Peer = require( 'peerjs')

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

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

var peer = new Peer(
..。
})

var conn = peer.connect( 'id')
conn.serialization = 'none'
conn.send( 'hello from nodejs!')

それだけです、よろしく、JP

全てのコメント65件

@helloIAmPauによるWebRTCのnode.js実装を作成するイニシアチブを見つけました: https://github.com/helloIAmPau/node-rtc/。 多分力を束ねることは可能ですか?

ちょっとジョス、

私はそれを監視します。 信頼できるwebrtcノードクライアントがある場合は
peerjsを移植するのは簡単なはずです。

2013年11月6日水曜日午前6時46分、Jos de [email protected]書き込み:

@helloIAmPauhttps ://github.com/helloIAmPauによるイニシアチブを見つけました
WebRTCのnode.js実装を作成します。
https://github.com/helloIAmPau/node-rtc/。 多分それはバンドルすることが可能です
力?


このメールに直接返信するか、Gi tHubhttps://github.com/peers/peerjs/issues/103#issuecomment-27878686で表示してください

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

https://github.com/modeswitch/node-webrtcも参照してください。 node-rtcはそれに置き換えられていると思います。

エリックに感謝します、それは素晴らしいことです。

これにより、 MCUとして機能するnode.jsアプリケーションが、WebRTCの最後のGoogle I / OでJustinUbertiが説明したスターアーキテクチャで、ピアのグループ(電話会議)のビデオ/オーディオストリームを制御できるようになります(23から:19)。 Node.jsはストリームの処理に優れているため、最適です。

@ericzこの問題を解決する理由は何ですか? node.jsのサポートは本当に素晴らしく強力です。

ちょっとジョスデジョン、

アクションアイテムがないため閉じましたが、機能を監視できるように再度開きます:)

わかりましたありがとう。 タイトルを「node.jssupport」のようなものに調整して、問題に適切なラベルを付けてください...

:+1:これは非常に便利な機能です。

:+1:これにも賛成。

:+1:大いに必要

+1

私はなんとかいくつかのオブジェクトをモックし、node.jsでpeerjsを実行させることができました

window = {};
window.BlobBuilder = require( "BlobBuilder");
location = {};
location.protocol = "http";

BinaryPack = require( "binary-pack");
XMLHttpRequest = require( "xmlhttprequest")。XMLHttpRequest;

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

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

私はなんとかpeerjsに接続を設定させ、サーバーに接続を取得させることができました。 ただし、データを送信しようとすると、フォローエラーが発生します

[エラー:接続が開いていません。 メッセージを送信する前に、 openイベントをリッスンする必要があります。]

これが完全な要点です

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

そして、これらのnpmパッケージをインストールする必要があります

npm install BlobBuilder
npm installbinary-pack
npm install ws
npm install xmlhttprequest
npm install wrtc

ああ、これは本当に素晴らしいです! 見ていきます:)。

ミシェル

2014年5月6日火曜日午前7時37分、Piyush [email protected]書き込み:

私はなんとかいくつかのオブジェクトをモックし、node.jsでpeerjsを実行させることができました

window = {};
window.BlobBuilder = require( "BlobBuilder");
location = {};
location.protocol = "http";

BinaryPack = require( "binary-pack");
XMLHttpRequest = require( "xmlhttprequest")。XMLHttpRequest;

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

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

私はなんとかpeerjsに接続を設定させ、サーバーに接続を取得させることができました。
ただし、データを送信しようとすると、フォローエラーが発生します

[エラー:接続が開いていません。 オープンイベントに耳を傾ける必要があります
メッセージを送信する前に。]

これが完全な要点です

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

そして、これらのnpmパッケージをインストールする必要があります

npm install BlobBuilder
npm installbinary-pack
npm install ws
npm install xmlhttprequest
npm install wrtc


このメールに直接返信するか、Gi tHubhttps://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分、 Lixissimusnotifications @ github.com
書きました:

peerjs用のノードモジュールがありますが、まだ動作していないと思います。 私が
それを必要とする、私はウィンドウが定義されていないことを取得します、これは公正な異議です。
https://www.npmjs.org/package/peerjs#readme

だから私は興味があります:何かが起こっていますか? 持っているのはとても素晴らしいでしょう
それ! ;)


このメールに直接返信するか、GitHubで表示してください
https://github.com/peers/peerjs/issues/103#issuecomment-60287567

それで、それは何をすることになっていますか?

ノードについて混乱しているだけかどうかはわかりませんが、peerjsモジュール自体がブラウザからしか使用できない場合、peerjs用のnpmモジュールがあるのは奇妙に思えますか?

申し訳ありませんが、これは私たちがバウアーでライブラリを公開し始める前でした。

ミシェル

2014年10月23日木曜日午前11時51分、Alan [email protected]
書きました:

ノードについて混乱しているだけなのかわかりませんが、持っているのは奇妙に思えます
peerjsモジュール自体がからのみ使用できる場合はpeerjsのnpmモジュール
ブラウザ?


このメールに直接返信するか、GitHubで表示してください
https://github.com/peers/peerjs/issues/103#issuecomment-60289790

@AChusuei npmにブラウザ固有のライブラリ、または同形ライブラリを使用しても問題はありません。 フルスタックのJSWebアプリケーションでは、Iibrariesの半分をnpmから取得し、残りの半分をbowerから取得するのではなく、npmのみを処理する必要があります。

@michellepeerjsがnode.jsクライアントのサポートを取得することを本当に望んでいます!!

@josdejong 、私はあなたがそのようにそれをすることができると思います。 私はまだノードの世界に不慣れで、別のことをすることにオープンです!

:+1:

この問題が解決されるまで、ヘッドレスブラウザで回避策が考えられる場合があります。 私は自分でそれらをテストしていません:

  • phantom.js->はうまくいくかもしれませんが、私が知っているように、彼らは現在webrtcをサポートしていません
  • xvfbを介してChromeを起動します。詳細については、 https ://blog.andyet.com/2014/09/29/testing-webrtc-applicationsを参照してください。

2つ目は試してみます。

:+1:

この機能は+2 ^ 56!

:+1:

:+1:

:+1:

+1

@piyushranjanによって投稿されたハックは、グローバルに何もエクスポートしないため(すべてのモジュールが1つのファイルに含まれているため)、現在の安定バージョンでは機能しないようです。

これの回避策は、「コンパイルされていない」/連結されたバージョンを使用することのようです。

したがって、リポジトリのクローンを作成してから、次のようにします。

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...
});

global / windowオブジェクトへのすべての個別のパーツのロードを処理する、下部近くのrequire行に特に注意してください。

それでも厄介なハックですが、少なくとも非常に基本的なテストでは機能するようです。

注:同じ注意事項が適用されますが、最初にいくつかのパッケージをインストールする必要があります。

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. ID 'peer1'のクライアントピアを接続するhtmlファイルpeer1.htmlを作成します。

`` `html



peer1



`` `
  1. node.jsスクリプトpeer3.jsを作成します。

`` `js
ウィンドウ=グローバル;
window.BlobBuilder = require( "BlobBuilder");
location = {プロトコル: 'http'};

BinaryPack = require( "binary-pack");
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( '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は「peer3への新しい接続」を出力しますが、メッセージは受信されません。

私はそれをテストすることにそれほど遠くはなかったのではないかと思います-フランケンシュタインが本番環境で使用するのは少し思えたので、結局それを残しました。 ごめん :(

:+1:

:+1:

これに関する更新はありますか?

@josdejong問題はシグナリングデータにあります。 オファー/アンサーにSTUNデータが添付されていないようです。 このデータがないと、実際の接続を確立できません。 以下は、ブラウザとノード間の接続を確立しますが、peerjsシグナリングはありません。

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

+1

+1

誰もが賞金を開きたいですか?

これは2年以上開いているので:ブラウザとノードでP2Pを動作させる(他の)既知のパッケージはありますか?

チェックアウトする時間がありませんでしたが、 https://github.com/feross/simple-peerによると、node.jsとブラウザーの両方で機能するとのことです。

これはあなたが探しているものですか? https://github.com/socketio/socket.io-p2p

READMEから:

「このモジュールは、ピア間のWebRTC接続をセットアップし、イベント(socket.io-protocol)を使用して通信するための簡単で信頼性の高い方法を提供します。

Socket.IOは、シグナリングデータを転送するため、およびWebRTCPeerConnectionがサポートされていないクライアントのフォールバックとして使用されます。」

私に関する限り、ノードでは機能しません。 そのため、私はこのスレッドに遭遇しました。

うーん。 もっと具体的に教えていただけますか? 私は今それを使用しています。ノードサーバーを使用してピアを接続し、ピアは相互に、および/またはノードサーバーのマシンへのwebRTC接続を確立します。

ノードサーバーを使用してピアを接続し、ピアは相互にwebRTC接続を確立します

つまり、クライアントとして実行しているわけではありません。 あなたは_other_クライアントを接続するサーバー上でそれを実行しています(ノードアプリであるとは言わないでください-もしそうなら、私はあなたがそれらをどのように設定するかに興味があります)。
このスレッドは、ノードアプリケーションのピア(クライアント)としてpeerjs(または場合によっては他のもの)を使用することに関するものです。

相互および/またはノードサーバーのマシンへのwebRTC接続

その2番目の部分は、まさにここで議論されていることのようです。 他の誰かがこれを確認できますか?

いいえ、問題はNodeJSをWebRTCクライアントとして使用していることです。 つまり。 必ずしもサーバーではないNodeJSインスタンスから接続します。

ああ、お詫びします。 SimplePeerがそれを行います。 ただし、サーバープラットフォームに特定のwebrtc機能がインストールされている必要があります。 'wrtc'モジュールは、ほとんどのマシンでこれを提供します。 特に、あなたにとって重要な場合に備えて、現在ラズベリーパイには_ない_(私にとってはそうです!)

readme.mdからのスニペット:

ノード内

このライブラリをノードで使用するには、パラメータとしてopts.wrtcを渡します。

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

var peer1 = new SimplePeer({イニシエーター:true、wrtc:wrtc})
var peer2 = new SimplePeer({wrtc:wrtc})

+1これは素晴らしい機能です

electronic-webrtcまたはwebrtc-nativeをチェックしてください。 node.jsインスタンスにelectron-webrtcを使用して、ブラウザーに接続します(特にデータチャネルを使用)

概要
こんにちは、これは古いと思いますが、あなたや誰かがこれを必要とするかもしれません。 私は自分の論文に取り組んでおり、いくつかの一歩を踏み出しました。 私は多くのことを試しましたが、simplepeerにはシグナリングが実装されていません。 データチャネル(nodejs peerjs webrtc)を介したメッセージの送信-デプロイされたシグナリングサーバー(peerserver)を使用したRaspberry Pi 2(ARM、Raspbian Jessie、ただしどこでも機能するはずです)のネットワークを介してメッセージを送信するようになりました。 もう1つのクライアントは、Windows環境のFirefoxブラウザです。 ここでの議論がなければ成し遂げられなかったので、コミュニティに還元します。

何をすべきか(すべきでないか)についての重要なこと:
-少なくとも私のアプリケーションでは、セレンを使用しないでください。十分な速度ではありません。
-xvfbは私にとってはうまくいきませんでした、まあそれはうまくいきました
-peerjsモジュールは必要ありません
-少なくともRaspberryでは-とにかくwrtcはarmに使用できないため、electron-webrtcを使用します
-シリアル化を使用しないでください

すべてを自分で行うのは難しいので、コードは次のとおりです。
ウィンドウ=グローバル
window.BlobBuilder = require( "BlobBuilder")
location = {プロトコル: 'http'}

BinaryPack = require( "binary-pack")
XMLHttpRequest = require( "xmlhttprequest")。XMLHttpRequest;
var wrtc = require( 'electron-webrtc')()
// var Peer = require( 'peerjs')

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

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

var peer = new Peer(
..。
})

var conn = peer.connect( 'id')
conn.serialization = 'none'
conn.send( 'hello from nodejs!')

それだけです、よろしく、JP

こんにちは@jeryfast 、あなたの解決策に感謝します、私はそのようなものを探していました👍

Mac(まだラズベリーではない)でテストしたところ、「「RTCDataChannel」に「binaryType」プロパティを設定できませんでした:Blobサポートはまだ実装されていません」というエラーが表示されていました。

いくつか検索した後、ファイルutilsのパスnode_modules / peerjs / libの116行目あたりで次のことがわかりました。

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

これが原因でエラーが発生し、アプリがクラッシュします。

コードにコメントが付けられている場合、アプリは機能し、ブラウザークライアントとして動作します。 しかし、これは汚いハックなので、ライブラリからコードを変更しないように「構成」または実行する方法を探していましたが、今まで何も見つかりませんでした。

課題は、そのコードが実行されるとき、つまりモジュールのロードプロセスで、エクスポートの要求が行われるときに発生します。

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

誰かがこれを修正する方法についてのアイデアや提案を持っていますか?

よろしく

いいですね、「none」シリアル化を使用すると、ライブラリ内の何も変更せずに機能します。 よろしく

こんにちは@jeryfastあなたが言ったようにそれはラズベリーで動作します。 前回の投稿の問題はOSXに関連しています。

まあ、それは素晴らしい仕事です👍

いいえ、楽しみを始めましょう💃

こんにちは
このエラーが発生します。
`` `
global.postMessage(messageName、 '*');
^

TypeError:global.postMessageは関数ではありません
Object.setZeroTimeoutPostMessage [as setZeroTimeout](

@crosogf 、そのエラーは私にはもっと大きな問題の兆候のように見えます。 postMessageが使用されるのは、エラー処理コードのみのようです。 私の推測では、lib / util.jsでのバイナリブロブサポートの検出と関係があると思います(コード@ nuno-nlfsoftwareはコメントアウトするように言っています)。 コードが存在する場所が2つあることに気付きました。dist/ peer.jsまたはdist / peer.min.jsと、lib /util.jsです。 私にとっては、後者への変更のみが効果的でした( @jeryfastがlib / exports.jsを要求するハックのため)。

これをここに残しておきますhttps://www.npmjs.com/package/peerjs-nodejs

また、接続のシリアル化をnoneに設定する必要はありません。 binary以外のオプションを使用できます。バイナリがデフォルトであるため、設定する必要があります。 私はそれをjsonに設定しました。これは問題なく機能します。

これをここに残しておきますhttps://www.npmjs.com/package/peerjs-nodejs

おかげで、私はそれがPeerJSの一部であるべきだと思います。

これがテスト後の私のコードですjeryfastpeerjs-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サーバーで( peerjs-nodejsを使用して)ピアインスタンスを作成するとすぐに、このエラーが発生します。 現在、リモートピアへの接続も作成していません。 誰かがそれを解決しましたか?

server.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 評価

関連する問題

furozen picture furozen  ·  9コメント

RikdeVos picture RikdeVos  ·  6コメント

senihtosun picture senihtosun  ·  5コメント

nhducseuit picture nhducseuit  ·  5コメント

geraldsamosir picture geraldsamosir  ·  6コメント