댓글 검색 목록

[javascript] 한 개발자가 JavaScript만으로 AirDrop을 재현 한 방법

페이지 정보

작성자 운영자 작성일 20-12-18 14:56 조회 688 댓글 0

iPhone 또는 Mac에서 AirDrop을 사용한 적이 있습니까?


좋아, 그렇지 않다면 버튼을 탭하여 휴대폰이나 노트북간에 파일을 원활하게 공유하는 것을 상상할 수 있습니까?


Robin Linus가 만든 SnapDrop.net을 사용하면 브라우저를 사용하여 모든 장치간에 파일을 직접 공유 할 수 있습니다. iPhone과 Android 또는 PC와 태블릿 사이에 있든 상관 없습니다.


그리고 클라우드에 업로드하거나 다운로드 할 필요가 없습니다. ?


그래서 도대체 어떻게 작동합니까?


한 줄씩 분석 한 결과, 그 훌륭한 아키텍처를 알아 냈습니다. 이 포스트에서는 어떻게 작동하는지 보여 드리겠습니다.


https://dev.to/abdisalan_js/how-one-developer-recreated-airdrop-using-just-javascript-2403


이 신기술 사용 


이 기술을 아는 것은 그것이 제공하는 것을 아직 탐구하지 않은 다른 엔지니어들과 차별화 될 수 있습니다.


이 멋진 기술은 WebRTC (Web Real-Time Communication)이며 불과 몇 년 전에 나왔습니다. 데이터 채널을 통해 SnapDrop은 한 피어에서 다른 피어로 직접 바이트 (오디오 및 비디오 포함!)를 보낼 수 있습니다.


(피어를 휴대폰이나 노트북과 같은 장치로 생각)


그러나 WebRTC는 도움 없이는 두 명의 사용자를 연결할 수 없습니다. 즉, 다른 피어를 발견하고 연결 방법을 보여주는 신호 서버가 필요합니다.


WebRTC는 이것 없이는 사용할 수 없습니다 


Diagram of Architecture. NodeJS Server connected to a phone and computer over websockets. Phone and computer are connected with WebRTC 


ICE (Interactive Connectivity Establishment)는 컴퓨터가 공용 IP 주소가 없을 때 인터넷에서 자신에게 지도를 그릴 수 있는 방법입니다. 이는 라우터와 컴퓨터간에 발생하는 NAT (Network Address Translation) 때문입니다.


지도가 만들어지면 이 두 장치가 지도를 서로 공유 할 수 있는 방법을 찾을 수 있습니다. SnapDrop은 WebSocket을 사용하여 각 피어간에 통신하는 NodeJS 서버를 통해 이를 수행합니다. 또 다른 멋진 프로토콜입니다.


이제 당신은 아마도 이것이 안전한가요?


좋아요,하지만 이 물건을 어떻게 보호합니까? 


전송 중인 WebRTC는 기본적으로 데이터를 암호화합니다. 그것은 멋지고 모든 것이지만 아마도 임의의 사람들과 파일을 공유하고 싶지 않을 것입니다.


SnapDrop은 동일한 IP 주소를 가진 두 컴퓨터간에 만 ICE를 공유합니다. 즉, 동일한 네트워크 / wifi에 있음을 의미합니다.


각 IP 주소에 대한 방을 생성하여 이를 수행하고 고유 한 ID를 생성하여 장치를 구별합니다.


/* Code to handle joining peers from the server */
_joinRoom(peer) {
    // if room doesn't exist, create it
    if (!this._rooms[peer.ip]) {
      this._rooms[peer.ip] = {};
    }

    // add this peer to room
    this._rooms[peer.ip][peer.id] = peer;
}


누구나 파일을 보낼 수 있으므로 공용 Wi-Fi에서 이 앱을 사용하고 싶지 않을 수 있습니다. 하지만 이 전염병에서 누가 외부로 나가고 있습니까? ?‍♀️


위의 코드 조각은 서버 클래스의 개체에 피어를 저장하여 흥미로운 선택을 합니다. 일반적으로 데이터베이스가 사용될 것으로 예상하지만 이것은 작업을 단순화 하기 위한 것일 수 있으며 앱에 트래픽이 많지 않을 수 있습니다.


친숙한 사용자 인터페이스 및 사용자 경험 


SnapDrop Site with icons for 2 computers and a phone 


스타일은 AirDrop과 거의 똑같습니다. 각 장치에는 재미있는 이름과 아이콘이 있어 각 피어를 구별 할 수 있습니다. 뿐만 아니라 다음과 같은 몇 가지 멋진 기능을 제공하는 진보적 인 웹 앱입니다.


  • 네이티브 앱 같은 느낌
  • 알림
  • 라이브 업데이트

장치가 WebRTC를 지원하지 않는 경우 어떻게 합니까? 


지금까지 대부분의 장치 / 브라우저는 WebRTC를 지원하지만 지원하지 않는 경우 SnapDrop에 대체 기능이 있습니다! 이 경우 이미 설정된 WebSocket 연결을 사용하여 파일 데이터를 보냅니다.


그러나 데이터가 최종 목적지에 도달하기 전에 먼저 서버로 이동해야 하기 때문에 이는 덜 효율적이고 덜 안전합니다.


if (window.isRtcSupported && peer.rtcSupported) {
    this.peers[peer.id] = new RTCPeer(this._server, peer.id);
} else {
    this.peers[peer.id] = new WSPeer(this._server, peer.id);
}


이벤트 기반 코드 스타일 


코드베이스는 완전히 이벤트 중심입니다. 서비스를 서로 분리하고 작업 발생시 처리를 허용하려는 경우 이 스타일을 사용합니다.


이는 WebRTC 및 WebSockets도 이벤트 기반이기 때문에 칭찬합니다. 메시지가 들어 오거나 새로운 피어가 합류하거나 파일이 전송되기를 원할 때 이것이 이벤트입니다.


선형 프로세스가 아니기 때문에 처음에는 따라 가기가 정말 어렵습니다. 다음은 이벤트 등록 및 실행을 위한 클래스입니다.


class Events {
    static fire(type, detail) {
        window.dispatchEvent(new CustomEvent(type, { detail: detail }));
    }
    static on(type, callback) {
        return window.addEventListener(type, callback, false);
    }
}


이렇게 이벤트 기반 코드를 작성할 수 있습니다.


Events.on('signal', e => this._onMessage(e.detail));
Events.on('peers', e => this._onPeers(e.detail));
Events.on('files-selected', e => this._onFilesSelected(e.detail));
Events.on('send-text', e => this._onSendText(e.detail));
Events.on('peer-left', e => this._onPeerLeft(e.detail));


직접 코드 확인 


오늘 배웠기를 바랍니다! 직접 코드를 살펴보고 싶다면 여기 github 저장소가 있습니다. https://github.com/RobinLinus/snapdrop


제작자는 또한 여러분이 직접 실행하고 호스팅 할 수 있도록 도커 작성 파일을 만들 수 있을 만큼 친절했습니다. 얼마나 많은 사람들이 자신의 SnapDrop 인스턴스를 실행하고 있는지 궁금합니다.


댓글목록 0

등록된 댓글이 없습니다.

웹학교 로고

온라인 코딩학교

코리아뉴스 2001 - , All right reserved.