M2O

M2O

최근 많은 사람들이 인터넷 스트리밍 방송을 시청한다. 대다수의 인터넷방송이 화면 및 사운드만을 전송하는 단방향 커뮤니케이션이다. 이에 원격제어를 더해 양방향성을 제공하므로써 사용자들의 참여를 유도한다.

M2O

개발 목적 및 동기

  • 최근 많은 사람들이 인터넷 스트리밍 방송을 시청한다. 대다수의 인터넷방송이 화면 및 사운드만을 전송하는 단방향 커뮤니케이션이다. 이에 원격제어를 더해 양방향성을 제공하므로써 사용자들의 참여를 유도한다.
  • 기존의 원격제어는 전체 화면을 공유하여 원치않는 화면까지 공유하게 된다. 이를 막기 위해 공유하고자 하는 프로세스를 선택하여 해당 프로세스만을 제어할 수 있도록 한다.

개발 목적

M2O는 원격제어를 통해 자신의 모든 프로세스에 대해 권한을 넘겨주는 기존의 원격제어와는 다르게 특정 프로세스의 화면만을 공유하여 공유되는 컴퓨터의 개인정보를 보호할 수 있도록 한다. 뿐만 아니라 1:1 원격제어가 아닌 1:N 연결을 통해 여러 사람이 같은 화면을 보며 제어까지도 할 수 있도록 한다. 제어권은 한 사람이 갖고 있으며 제어권 요청 및 위임이 가능하다. 이를 통해 여러 사람이 동시에 원격제어를 하였을 때 발생할 수 있는 이벤트중복을 막아 원활한 원격제어 환경을 만든다.

개발 목표

  1. 중계 서버를 통해 생성된 방의 리스트를 제공. 각 사용자가 프로그램에 접속할 때마다 IP를 입력해서 접속을 하는 불편함을 중계 서버를 사용하여 줄인다. 또한 생성된 방들의 목록을 사용자에게 제공한다.
  2. 방에 입장한 사용자에게 화면 공유. 방을 생성한 사용자의 화면을 해당 방에 입장한 사용자들에게 공유한다. 화면 공유는 특정 프로세스의 윈도우뿐만 아니라 전체 화면 또한 지원 가능하다.
  3. 하나의 제어권을 다수의 사용자와 공유하여 제어. 생성된 방에서 사용자들은 방장이 공유한 프로세스의 윈도우에 제어권을 요청할 수 있다. 제어권은 해당 프로세스에 대해서만 제공되며 방장이 제어권을 허용할 경우, 제어권을 다른 사용자에게 넘겨줄 수 있다.
  4. 방에 접속할 수 있는 인원은 최대 5명. 많은 수의 사용자가 동시에 접속할 경우, 처리속도가 지연될 수 있어 원활한 공유가 불가능해질 수 있다. 따라서 원활한 공유를 위해서 최소 5명이 동시에 접속하여 공유할 수 있도록 하고, 개발 후 성능에 따라 늘릴 수 있도록 한다.

제약사항

Symmetric NAT을 통한 접속은 불가능하다. 전체화면 공유 시 듀얼모니터는 지원하지 않는다.

개발 내용

시스템 아키텍처

System Architecture는 위의 그림과 같다. Application은 방을 생성하느냐 방에 참여하느냐에 따라 Host와 Client로 나뉘게 된다. Host는 방을 생성하여 자신의 컴퓨터 화면을 공유하며 Client는 방에 참여하여 제어권을 얻었을 때 이벤트를 받아 Host에 전송한다. Host와 Client는 화면, 사운드 및 이벤트를 전달해야하므로 Communication Module이 존재하고 UDP로 정보를 주고받는다. Host의 경우 화면을 전달해야하므로 Capture Module이 화면을 캡쳐 하며 Hooking Module을 통해 Client가 전달한 이벤트를 Host에서 발생시킨다. Hooking Module에는 Keybord와 Mouse Hooker가 존재한다. Client는 이벤트를 전달하기 위한 Event receiver가 있으며 Host가 전달하는 이미지를 View를 통해 사용자에게 보여 준다. Server는 Application의 로그인처리, 명령어요청, 채팅 및 방 정보를 관리한다. Application 사이의 통신과는 다르게 전송속도보다 정확도가 더 중요하므로 Server와의 통신은 TCP/IP 프로토콜을 사용한다.

서버 아키텍처

방 중계 및 채팅을 위한 Server는 Node.js를 통해 Tcp/Ip Server로 구현한다. M2O Client와의 통신은 Json 데이터 형태로 통신한다. Server의 Json 통신은 json-over-tcp 모듈을 사용하여 구현한다. 특히 Node.js의 Nodemailer 모듈을 통해 유저등록 인증번호 전송 및 Password 찾기 기능을 구현했다. 등록된 Id의 Email로 임시 비밀번호를 발송한다. Server의 I/O Socket을 통해 현재 개설되어있는 방의 List 정보, 각 방의 세부정보 및 참여인원 정보 및 화면, 사운드, 제어권 상태, 각 방의 채팅 메시지 정보를 담는다. Stun 모듈은 처음 클라이언트와 연결될 때, 클라이언트의 IP와 PORT를 받아 기록한다. 다른 클라이언트와 연결을 요청할 때 해당 클라이언트의 IP와 PORT를 보내 주어 홀 펀칭을 통해 서로 UDP로 통신할 수 있도록 한다.

개발 환경

OS : Windows7 Language : Javascript, C# / WAS : Apache Tomcat 7 Tool : Visual Studio 2010, 2013, eclipse