๋ธ๋ผ์ฐ์ ๋์ node.js ์ ํ๋ฆฌ์ผ์ด์ ์์ peer.js ํด๋ผ์ด์ธํธ๋ฅผ ์คํํ ์ ์์ต๋๊น?
๋ธ๋ผ์ฐ์ ์ node.js ์ ํ๋ฆฌ์ผ์ด์ ๋ชจ๋์ ์๋ (ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์) ํผ์ด๋ก ๊ตฌ์ฑ๋ ํผ์ด ํฌ ํผ์ด ๋คํธ์ํฌ๋ฅผ ๋ง๋ค๊ณ ์์ต๋๋ค. ๋น๋์ค/์ค๋์ค๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ ์๋ก ๋ณด๋ด์ผ ํฉ๋๋ค. WebRTC๋ ์ค์ ์ง์ค์ ํด๋ผ์ด์ธํธ/์๋ฒ ๊ตฌ์กฐ ์์ด ํผ์ด ๊ฐ์ ๋ผ์ฐํ ๋ฐ ํต์ ์ ํด๊ฒฐํ๋ ํ๋ฅญํ ์๋ฃจ์ ์ด ๋ ๊ฒ์ ๋๋ค. ํ์ง๋ง WebRTC๋ ๋ธ๋ผ์ฐ์ ์์๋ง ์ง์๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด ์ง๋ฌธ๋ ์ฐธ์กฐํ์ญ์์ค. http://stackoverflow.com/questions/18872712/node-js-webrtc-client
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:
์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๋๊น์ง ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ์์ ๊ฐ๋ฅํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ต๋๋ค. ๋๋ ์ง์ ํ ์คํธํ์ง ์์์ต๋๋ค.
๋ ๋ฒ์งธ๋ก ์๋ํด ๋ณด๊ฒ ์ต๋๋ค.
:+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 ์ค์ ๋ก ์ฐ๊ฒฐ๋์ด ์คํ ์ค์ด๊ณ ์๋ฅผ ๋ค์ด ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์์ต๋๊น?
๋๋ ์ง๊ธ๊น์ง ์ด๊ฒ์ ์ฑ๊ณตํ์ง ๋ชปํ๋ค. ์ฐ๊ฒฐ์ ์ด ์ ์๋ ๊ฒ ๊ฐ์ง๋ง ์์ฑ๋ ๋ฐ์ดํฐ ์ฑ๋์ด ์์ต๋๋ค.
์ด๊ฒ์ด ๋ด๊ฐ ์๋ํ ๊ฒ์ ๋๋ค.
sudo apt-get install libnss3-dev libexpat1-dev
npm install peerjs BlobBuilder binary-pack ws xmlhttprequest wrtc
'peer1'
์ธ ํด๋ผ์ด์ธํธ ํผ์ด๋ฅผ ์ฐ๊ฒฐํ๋ peer1.html html ํ์ผ์ ๋ง๋ญ๋๋ค.``` HTML
``` 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 + '!');
});
});
```
๋๋ฒ๊ทธ ์ถ๋ ฅ์ ๋ณด๋ฉด peer3๊ฐ peer1์ ์ฑ๊ณต์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋ฐ์ดํฐ ์ฑ๋์ ์ค์ ํ์ง ์์ต๋๋ค. peer1์ "new connection to peer3"์ ์ถ๋ ฅํ์ง๋ง ์์ ๋ ๋ฉ์์ง๋ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ํ ์คํธํ๋ ๋ฐ ๊ทธ๋ค์ง ๋ฉ๋ฆฌ ๊ฐ์ง ๋ชปํ๋ค๋ ๊ฒ์ด ์ ๊ฐ์ ๋๋ค. Frankenstein์ด ํ๋ก๋์ ์์ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ๋ณด์์ผ๋ฏ๋ก ๊ฒฐ๊ตญ ๋ ๋ฌ์ต๋๋ค. ์ฃ์กํฉ๋๋ค :(
:+1:
:+1:
์ด์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
@josdejong ๋ฌธ์ ๋ ์ ํธ ๋ฐ์ดํฐ์ ์์ต๋๋ค. ์ ์/๋ต๋ณ์ STUN ๋ฐ์ดํฐ๊ฐ ์ฒจ๋ถ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ์ค์ ์ฐ๊ฒฐ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋ค์์ ๋ธ๋ผ์ฐ์ ์ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ์ง๋ง peerjs ์๊ทธ๋๋ง ์์ด ์ฐ๊ฒฐํฉ๋๋ค.
+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)
๋๊ตฐ๊ฐ ๋์์ค ์ ์์ต๋๊น? ๊ฐ์ฌ ํด์.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ฐ์
์๋ ํ์ธ์, ๋๋ ์ด๊ฒ์ด ์ค๋๋ ๊ฒ์ ์์ง๋ง ๋น์ ์ด๋ ๋๊ตฐ๊ฐ๊ฐ ์ด๊ฒ์ ํ์๋ก ํ ๊ฒ์ ๋๋ค. ์ ๋ ๋ ผ๋ฌธ์ ์์ฑ ์ค์ด๋ฉฐ ์์ผ๋ก ๋ช ๊ฐ์ง ๋จ๊ณ๋ฅผ ๋ฐ์์ต๋๋ค. ๋๋ ๋ง์ ๊ฒ์ ์๋ํ์ง๋ง 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