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, ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ๊ณณ์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•จ)์˜ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ด์ œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๋Š” Windows ํ™˜๊ฒฝ์˜ ํŒŒ์ด์–ดํญ์Šค ๋ธŒ๋ผ์šฐ์ €์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๊ท€ํ•˜์˜ ํ† ๋ก ์ด ์—†์—ˆ๋‹ค๋ฉด ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์„ ๊ฒƒ์ด๋ฏ€๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋˜๋Œ๋ ค ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

ํ•˜์ง€ ๋ง์•„์•ผ ํ•  ๊ฒƒ(ํ•˜์ง€ ๋ง์•„์•ผ ํ•  ๊ฒƒ)์— ๋Œ€ํ•œ ์ฃผ์š” ์‚ฌํ•ญ:
- ์ตœ์†Œํ•œ ๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—๋Š” ์…€๋ ˆ๋Š„์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
-xvfb๋Š” ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
- peerjs ๋ชจ๋“ˆ์ด ํ•„์š”ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
-์ตœ์†Œํ•œ Raspberry์—์„œ๋Š” - wrtc๋ฅผ ํŒ”์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ electron-webrtc๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
- ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋ชจ๋“  ๊ฒƒ์„ ์Šค์Šค๋กœ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ฐฝ = ์ „์—ญ
window.BlobBuilder = require("BlobBuilder")
์œ„์น˜ = {ํ”„๋กœํ† ์ฝœ: 'http'}

BinaryPack = require("๋ฐ”์ด๋„ˆ๋ฆฌ ํŒฉ")
XMLHttpRequest = ์š”๊ตฌ("xmlhttprequest").XMLHttpRequest;
var wrtc = require('์ „์ž-webrtc')()
//var Peer = require('peerjs')

RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSession์„ค๋ช…;
RTCIceCandidate = wrtc.RTCIceCandidate;

์›น์†Œ์ผ“ = ํ•„์š”('ws')
require('/ํ™ˆ/ํŒŒ์ด/๋…ธ๋“œ_๋ชจ๋“ˆ/peerjs/lib/exports.js');

var ํ”ผ์–ด = ์ƒˆ๋กœ์šด ํ”ผ์–ด(
...
})

var conn=peer.connect('ID')
conn.serialization='์—†์Œ'
conn.send('nodejs์—์„œ ์•ˆ๋…•ํ•˜์„ธ์š”!')

๊ทธ๊ฒŒ ๋‹ค์•ผ, ์•ˆ๋ถ€ JP

๋ชจ๋“  65 ๋Œ“๊ธ€

WebRTC์˜ node.js ๊ตฌํ˜„์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ @helloIAmPau ์˜ ์ด๋‹ˆ์…”ํ‹ฐ๋ธŒ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค: https://github.com/helloIAmPau/node-rtc/. ๊ตฐ๋Œ€๋ฅผ ๋ฌถ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ• ๊นŒ์š”?

์ด๋ด ์กฐ์Šค,

๊ณ„์† ์ง€์ผœ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” webrtc ๋…ธ๋“œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
peerjs๋ฅผ ์ด์‹ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2013๋…„ 11์›” 6์ผ ์ˆ˜์š”์ผ ์˜ค์ „ 6์‹œ 46๋ถ„, Jos de Jong ์•Œ๋ฆผ @github.com์ž‘์„ฑ:

@helloIAmPau https://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์—์„œ Justin Uberti๊ฐ€ ์„ค๋ช…ํ•œ ์Šคํƒ€ ์•„ํ‚คํ…์ฒ˜(23์ผ๋ถ€ํ„ฐ :19). Node.js๋Š” ์ŠคํŠธ๋ฆผ์„ ์ž˜ ๋‹ค๋ฃจ๋ฏ€๋กœ ๋งค์šฐ ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ericz ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? node.js์— ๋Œ€ํ•œ ์ง€์›์€ ์ •๋ง ํ›Œ๋ฅญํ•˜๊ณ  ๊ฐ•๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ผ ์กฐ๋ฐ์ข…

์ž‘์—… ํ•ญ๋ชฉ์ด ์—†์–ด์„œ ๋‹ซ์•˜์ง€๋งŒ ๊ธฐ๋Šฅ์„ ํƒญํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์‹œ ์—ด๊ฒ ์Šต๋‹ˆ๋‹ค :)

์•Œ์•˜์–ด ๊ณ ๋งˆ์›Œ. ์ œ๋ชฉ์„ "node.js ์ง€์›"๊ณผ ๊ฐ™์ด ์ž์œ ๋กญ๊ฒŒ ์กฐ์ •ํ•˜๊ณ  ๋ฌธ์ œ์— ์ ์ ˆํ•œ ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค...

:+1: ์ด๊ฒƒ์€ ๊ฝค ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

:+1: ์ด๊ฒƒ๋„ ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

:+1: ๋งŽ์ด ํ•„์š”ํ•˜๋‹ค

+1

๋‚˜๋Š” ์ผ๋ถ€ ๊ฐ์ฒด๋ฅผ ์กฐ๋กฑํ•˜๊ณ  node.js์—์„œ peerjs๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฐฝ={};
window.BlobBuilder = require("BlobBuilder");
์œ„์น˜={};
์œ„์น˜.ํ”„๋กœํ† ์ฝœ="http";

BinaryPack = require("๋ฐ”์ด๋„ˆ๋ฆฌ ํŒฉ");
XMLHttpRequest = ์š”๊ตฌ("xmlhttprequest").XMLHttpRequest;

var wrtc = ์š”๊ตฌ("wrtc");
RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSession์„ค๋ช…;
RTCIceCandidate = wrtc.RTCIceCandidate;

์›น์†Œ์ผ“ = ํ•„์š”('ws');
var peerClient =require("./peer.js");

๋‚˜๋Š” peerjs๊ฐ€ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ณ  ์„œ๋ฒ„๊ฐ€ ์—ฐ๊ฒฐ์„ ์–ป๋„๋ก ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋ ค๊ณ ํ•˜๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

[์˜ค๋ฅ˜: ์—ฐ๊ฒฐ์ด ์—ด๋ ค ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „์— open ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.]

์—ฌ๊ธฐ ์™„์ „ํ•œ ์š”์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค

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

๊ทธ๋ฆฌ๊ณ  ์ด npm ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

npm ์„ค์น˜ BlobBuilder
npm ์„ค์น˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒฉ
npm ์„ค์น˜ ws
npm install xmlhttp์š”์ฒญ
npm ์„ค์น˜ wrtc

์•„, ์ด๊ฑด ์ •๋ง ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค! ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค :).

๋ฏธ์…ธ

2014๋…„ 5์›” 6์ผ ํ™”์š”์ผ ์˜ค์ „ 7์‹œ 37๋ถ„์— Piyush Ranjan [email protected] ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ผ๋ถ€ ๊ฐ์ฒด๋ฅผ ์กฐ๋กฑํ•˜๊ณ  node.js์—์„œ peerjs๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฐฝ={};
window.BlobBuilder = require("BlobBuilder");
์œ„์น˜={};
์œ„์น˜.ํ”„๋กœํ† ์ฝœ="http";

BinaryPack = require("๋ฐ”์ด๋„ˆ๋ฆฌ ํŒฉ");
XMLHttpRequest = ์š”๊ตฌ("xmlhttprequest").XMLHttpRequest;

var wrtc = ์š”๊ตฌ("wrtc");
RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSession์„ค๋ช…;
RTCIceCandidate = wrtc.RTCIceCandidate;

์›น์†Œ์ผ“ = ํ•„์š”('ws');
var peerClient =require("./peer.js");

๋‚˜๋Š” peerjs๊ฐ€ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ณ  ์„œ๋ฒ„๊ฐ€ ์—ฐ๊ฒฐ์„ ์–ป๋„๋ก ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋ ค๊ณ ํ•˜๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

[์˜ค๋ฅ˜: ์—ฐ๊ฒฐ์ด ์—ด๋ ค ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณต๊ฐœ ์ด๋ฒคํŠธ๋ฅผ ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „์—.]

์—ฌ๊ธฐ ์™„์ „ํ•œ ์š”์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค

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

๊ทธ๋ฆฌ๊ณ  ์ด npm ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

npm ์„ค์น˜ BlobBuilder
npm ์„ค์น˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒฉ
npm ์„ค์น˜ ws
npm install xmlhttp์š”์ฒญ
npm ์„ค์น˜ 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, 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 Chusuei [email protected]
์ผ๋‹ค:

๋…ธ๋“œ์— ๋Œ€ํ•ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ด์ƒํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.
peerjs ๋ชจ๋“ˆ ์ž์ฒด๋ฅผ ๋‹ค์Œ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ peerjs์šฉ npm ๋ชจ๋“ˆ
๋ธŒ๋ผ์šฐ์ €?

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/peers/peerjs/issues/103#issuecomment -60289790.

@AChusuei npm์— ๋ธŒ๋ผ์šฐ์ €๋ณ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ๋™ํ˜• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด ์ „์ฒด ์Šคํƒ JS ์›น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ npm์—์„œ Iibraries์˜ ์ ˆ๋ฐ˜์„ ๊ฐ€์ ธ์˜ค๊ณ  bower์—์„œ ๋‚˜๋จธ์ง€ ์ ˆ๋ฐ˜์„ ๊ฐ€์ ธ์˜ค๋Š” ๋Œ€์‹  npm๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

@michelle ์ €๋Š” peerjs๊ฐ€ node.js ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์ง€์›์„ ๋ฐ›๊ธฐ๋ฅผ ์ •๋ง๋กœ ๋ฐ”๋ž๋‹ˆ๋‹ค!!

@josdejong ๋‹˜ , ๊ทธ๋ ‡๊ฒŒ ํ•˜์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์•„์š”. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋…ธ๋“œ ์„ธ๊ณ„์— ์ต์ˆ™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ผ์„ ๋‹ค๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

:+1:

์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ํ—ค๋“œ๋ฆฌ์Šค ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง์ ‘ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

  • phantom.js -> ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ง€๊ธˆ์€ webrtc๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • xvfb๋ฅผ ํ†ตํ•ด ํฌ๋กฌ ๋ถ€ํŒ…, ์—ฌ๊ธฐ์—์„œ ์ž์„ธํ•œ ์ •๋ณด ๋ณด๊ธฐ: https://blog.andyet.com/2014/09/29/testing-webrtc-applications

๋‘ ๋ฒˆ์งธ๋กœ ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

:+1:

๊ธฐ๋Šฅ์— ๋Œ€ํ•ด +2^56!

:+1:

:+1:

:+1:

+1

@piyushranjan ์ด ๊ฒŒ์‹œํ•œ ํ•ดํ‚น์€ ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ์•„๋ฌด๊ฒƒ๋„ ๋‚ด๋ณด๋‚ด์ง€ ์•Š๊ณ (๋ชจ๋“  ๋ชจ๋“ˆ์ด ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ์žˆ์Œ) ํ˜„์žฌ ์•ˆ์ • ๋ฒ„์ „์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ "์ปดํŒŒ์ผ๋˜์ง€ ์•Š์€"/์—ฐ๊ฒฐ๋œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ €์žฅ์†Œ๋ฅผ ๋ณต์ œํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜์‹ญ์‹œ์˜ค.

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' ์ธ ํด๋ผ์ด์–ธํŠธ ํ”ผ์–ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” peer1.html html ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

``` HTML



ํ”ผ์–ด1



```
  1. node.js ์Šคํฌ๋ฆฝํŠธ peer3.js ์ƒ์„ฑ:

``` js
์ฐฝ = ์ „์—ญ;
window.BlobBuilder = require("BlobBuilder");
์œ„์น˜ = {ํ”„๋กœํ† ์ฝœ: 'http'};

BinaryPack = require("๋ฐ”์ด๋„ˆ๋ฆฌ ํŒฉ");
XMLHttpRequest = ์š”๊ตฌ("xmlhttprequest").XMLHttpRequest;

var wrtc = ์š”๊ตฌ("wrtc");
RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSession์„ค๋ช…;
RTCIceCandidate = wrtc.RTCIceCandidate;

์›น์†Œ์ผ“ = ํ•„์š”('ws');

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

var ํ”ผ์–ด = new Peer('peer3', {ํ‚ค: 'lwjd5qra8257b9', ๋””๋ฒ„๊ทธ: true});

peer.on('์—ด๊ธฐ', ํ•จ์ˆ˜() {
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"์„ ์ถœ๋ ฅํ•˜์ง€๋งŒ ์ˆ˜์‹ ๋œ ๋ฉ”์‹œ์ง€๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ๊ทธ๋‹ค์ง€ ๋ฉ€๋ฆฌ ๊ฐ€์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด ์œ ๊ฐ์ž…๋‹ˆ๋‹ค. Frankenstein์ด ํ”„๋กœ๋•์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์œผ๋ฏ€๋กœ ๊ฒฐ๊ตญ ๋– ๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค :(

:+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

์ฝ์–ด๋ณด๊ธฐ์—์„œ:

"์ด ๋ชจ๋“ˆ์€ ํ”ผ์–ด ๊ฐ„์— WebRTC ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ณ  ์ด๋ฒคํŠธ(socket.io-protocol)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹ ํ•˜๋Š” ์‰ฝ๊ณ  ์•ˆ์ •์ ์ธ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Socket.IO๋Š” ์‹ ํ˜ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  WebRTC PeerConnection์ด ์ง€์›๋˜์ง€ ์•Š๋Š” ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•œ ๋Œ€์ฒด ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค."

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ, Node.js์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋‚œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

ํ . ์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ง€๊ธˆ ๋…ธ๋“œ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”ผ์–ด๋ฅผ ์—ฐ๊ฒฐํ•œ ๋‹ค์Œ ์„œ๋กœ ๋ฐ/๋˜๋Š” ๋…ธ๋“œ ์„œ๋ฒ„์˜ ์‹œ์Šคํ…œ์— webRTC ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”ผ์–ด๋ฅผ ์—ฐ๊ฒฐํ•œ ๋‹ค์Œ ์„œ๋กœ webRTC ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์‹คํ–‰ํ•˜์ง€ _์•Š์Šต๋‹ˆ๋‹ค_. _other_ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์„œ๋ฒ„์—์„œ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค(๋…ธ๋“œ ์•ฑ์ด๋ผ๊ณ  ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ - ๊ทธ๋ ‡๋‹ค๋ฉด ์„ค์ • ๋ฐฉ๋ฒ•์— ๊ด€์‹ฌ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).
์ด ์Šค๋ ˆ๋“œ๋Š” ๋…ธ๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ peerjs(๋˜๋Š” ์ž ์žฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ)๋ฅผ ํ”ผ์–ด(ํด๋ผ์ด์–ธํŠธ)๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„œ๋กœ ๋ฐ/๋˜๋Š” ๋…ธ๋“œ ์„œ๋ฒ„์˜ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ webRTC ์—ฐ๊ฒฐ

๊ทธ๊ฒƒ์˜ ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”, ๋ฌธ์ œ๋Š” NodeJS๋ฅผ WebRTC ํด๋ผ์ด์–ธํŠธ ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰. ๋ฐ˜๋“œ์‹œ ์„œ๋ฒ„์ผ ํ•„์š”๋Š” ์—†๋Š” NodeJS ์ธ์Šคํ„ด์Šค์—์„œ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์•„, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. SimplePeer๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŠน์ • webrtc ๊ธฐ๋Šฅ์ด ์„ค์น˜๋œ ์„œ๋ฒ„ ํ”Œ๋žซํผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 'wrtc' ๋ชจ๋“ˆ์€ ๋Œ€๋ถ€๋ถ„์˜ ๋จธ์‹ ์—์„œ ์ด๊ฒƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ง€๊ธˆ์€ ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด์—์„œ _not_, ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์—๊ฒŒ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ (๋‚˜์—๊ฒŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!)

readme.md์˜ ์Šค๋‹ˆํŽซ:

๋…ธ๋“œ์—์„œ

๋…ธ๋“œ์—์„œ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด opts.wrtc๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

var SimplePeer = require('๋‹จ์ˆœ ํ”ผ์–ด')
var wrtc = ์š”๊ตฌ('wrtc')

var peer1 = ์ƒˆ๋กœ์šด SimplePeer({ ๊ฐœ์‹œ์ž: true, wrtc: wrtc })
var peer2 = ์ƒˆ๋กœ์šด SimplePeer({ wrtc: wrtc })

+1 ์ด๊ฒƒ์€ ์ข‹์€ ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค

electron-webrtc ๋˜๋Š” webrtc-native๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๋‚ด node.js ์ธ์Šคํ„ด์Šค์— ์ „์ž-webrtc๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค(ํŠนํžˆ ๋ฐ์ดํ„ฐ ์ฑ„๋„ ์‚ฌ์šฉ)

๊ฐœ์š”
์•ˆ๋…•ํ•˜์„ธ์š”, ๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ค๋ž˜๋œ ๊ฒƒ์„ ์•Œ์ง€๋งŒ ๋‹น์‹ ์ด๋‚˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๊ฒƒ์„ ํ•„์š”๋กœ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๋…ผ๋ฌธ์„ ์ž‘์„ฑ ์ค‘์ด๋ฉฐ ์•ž์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ๋‹จ๊ณ„๋ฅผ ๋ฐŸ์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งŽ์€ ๊ฒƒ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ simplepeer์—๋Š” ๊ตฌํ˜„๋œ ์‹ ํ˜ธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ฑ„๋„(nodejs peerjs webrtc)์„ ํ†ตํ•ด ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ - ๋ฐฐํฌ๋œ ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„(peerserver)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Raspberry Pi 2(ARM, Raspbian Jessie, ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ๊ณณ์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•จ)์˜ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ด์ œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๋Š” Windows ํ™˜๊ฒฝ์˜ ํŒŒ์ด์–ดํญ์Šค ๋ธŒ๋ผ์šฐ์ €์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๊ท€ํ•˜์˜ ํ† ๋ก ์ด ์—†์—ˆ๋‹ค๋ฉด ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์„ ๊ฒƒ์ด๋ฏ€๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋˜๋Œ๋ ค ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

ํ•˜์ง€ ๋ง์•„์•ผ ํ•  ๊ฒƒ(ํ•˜์ง€ ๋ง์•„์•ผ ํ•  ๊ฒƒ)์— ๋Œ€ํ•œ ์ฃผ์š” ์‚ฌํ•ญ:
- ์ตœ์†Œํ•œ ๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—๋Š” ์…€๋ ˆ๋Š„์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
-xvfb๋Š” ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
- peerjs ๋ชจ๋“ˆ์ด ํ•„์š”ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
-์ตœ์†Œํ•œ Raspberry์—์„œ๋Š” - wrtc๋ฅผ ํŒ”์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ electron-webrtc๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
- ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋ชจ๋“  ๊ฒƒ์„ ์Šค์Šค๋กœ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ฐฝ = ์ „์—ญ
window.BlobBuilder = require("BlobBuilder")
์œ„์น˜ = {ํ”„๋กœํ† ์ฝœ: 'http'}

BinaryPack = require("๋ฐ”์ด๋„ˆ๋ฆฌ ํŒฉ")
XMLHttpRequest = ์š”๊ตฌ("xmlhttprequest").XMLHttpRequest;
var wrtc = require('์ „์ž-webrtc')()
//var Peer = require('peerjs')

RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSession์„ค๋ช…;
RTCIceCandidate = wrtc.RTCIceCandidate;

์›น์†Œ์ผ“ = ํ•„์š”('ws')
require('/ํ™ˆ/ํŒŒ์ด/๋…ธ๋“œ_๋ชจ๋“ˆ/peerjs/lib/exports.js');

var ํ”ผ์–ด = ์ƒˆ๋กœ์šด ํ”ผ์–ด(
...
})

var conn=peer.connect('ID')
conn.serialization='์—†์Œ'
conn.send('nodejs์—์„œ ์•ˆ๋…•ํ•˜์„ธ์š”!')

๊ทธ๊ฒŒ ๋‹ค์•ผ, ์•ˆ๋ถ€ JP

์•ˆ๋…•ํ•˜์„ธ์š” @jeryfast , ๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋Ÿฐ ๊ฒƒ์„ ์ฐพ๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

Mac(์•„์ง ๋ผ์ฆˆ๋ฒ ๋ฆฌ๊ฐ€ ์•„๋‹˜)์—์„œ ํ…Œ์ŠคํŠธํ–ˆ๋Š”๋ฐ "'RTCDataChannel'์—์„œ '์ด์ง„ ์œ ํ˜•' ์†์„ฑ์„ ์„ค์ •ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค: Blob ์ง€์›์ด ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค." ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ ๊ฒ€์ƒ‰ ํ›„ utils ํŒŒ์ผ์—์„œ node_modules/peerjs/lib ๊ฒฝ๋กœ 116๋ฒˆ์งธ ์ค„์—์„œ ๋‹ค์Œ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

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

์˜ค๋ฅ˜ ๋ฐ ์•ฑ ์ถฉ๋Œ์˜ ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ์— ์ฃผ์„์„ ๋‹ฌ๋ฉด ์•ฑ์ด ์ž‘๋™ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ € ํด๋ผ์ด์–ธํŠธ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋”๋Ÿฌ์šด ํ•ดํ‚น์ด๋ฏ€๋กœ lib์—์„œ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” "๊ตฌ์„ฑ"ํ•˜๊ฑฐ๋‚˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์ง€๊ธˆ๊นŒ์ง€๋Š” ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ํ•ด๋‹น ์ฝ”๋“œ ์กฐ๊ฐ์ด ์‹คํ–‰๋  ๋•Œ, ์ฆ‰ ๋ชจ๋“ˆ ๋กœ๋“œ ํ”„๋กœ์„ธ์Šค์—์„œ ๋‚ด๋ณด๋‚ด๊ธฐ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์™„๋ฃŒ๋  ๋•Œ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

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

๋ˆ„๊ตฌ๋“ ์ง€ ์ด๊ฒƒ์„ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด ๋˜๋Š” ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌธ์•ˆ ์ธ์‚ฌ

์ข‹์Šต๋‹ˆ๋‹ค. 'none' ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์•ˆ ์ธ์‚ฌ

์•ˆ๋…•ํ•˜์„ธ์š” ๋‹ค์‹œ @jeryfast ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด ๋ผ์ฆˆ๋ฒ ๋ฆฌ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋งˆ์ง€๋ง‰ ๊ฒŒ์‹œ๋ฌผ์˜ ๋ฌธ์ œ๋Š” OS X์™€ โ€‹โ€‹๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„์š” ์ผ์ด ์ตœ๊ณ ์ž…๋‹ˆ๋‹ค ๐Ÿ‘

์•„๋‹ˆ ์žฌ๋ฏธ๋ฅผ ์‹œ์ž‘ํ•ฉ์‹œ๋‹ค ๐Ÿ’ƒ

์•ˆ๋…•ํ•˜์„ธ์š”
์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
```
global.postMessage(๋ฉ”์‹œ์ง€ ์ด๋ฆ„, '*');
^^

TypeError: global.postMessage๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
Object.setZeroTimeoutPostMessage์—์„œ [setZeroTimeout์œผ๋กœ](

@crosogf , ๊ทธ ์˜ค๋ฅ˜๋Š” ๋” ํฐ ๋ฌธ์ œ์˜ ์ฆ์ƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. postMessage๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ์œ ์ผํ•œ ์žฅ์†Œ๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ฝ”๋“œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์— ๊ทธ๊ฒƒ์€ lib/util.js์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ blob ์ง€์› ๊ฐ์ง€์™€ ๊ด€๋ จ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(@nuno-nlfsoftware ์ฝ”๋“œ๋Š” ์ฃผ์„ ์ฒ˜๋ฆฌ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค). 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์˜ ์ผ๋ถ€์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ 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 ์„œ๋ฒ„์—์„œ ํ”ผ์–ด ์ธ์Šคํ„ด์Šค( peerjs-nodejs ์‚ฌ์šฉ)๋ฅผ ์ƒ์„ฑํ•˜์ž๋งˆ์ž ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง€๊ธˆ ์›๊ฒฉ ํ”ผ์–ด์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๊นŒ?

์„œ๋ฒ„.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 ๋“ฑ๊ธ‰