안드로이드 파일 공유 앱 개발: 설계
2020. 6. 12. 17:51
시작하기 전에 앞서
이 글은 강좌가 아니다. 한 뉴비 개발자의 개발일지일 뿐이고 단순히 기록 목적으로 남기는 글이다.
소스는 본문과 깃허브에 전부 공개해놓았다. 일단은 나 혼자 쓸 목적으로 만드는 거고 보안 문제나 안정성이 그닥 좋지 않기 때문에 혹시라도 이 소스를 쓰겠다면 공부나 개인적인 사용 외에는 쓰지 않기를 바란다.
개발 동기
별거없다.
컴퓨터에 폰 연결해서 파일을 주고받을 일이 많은데 파일 옮기려 할 때마다 USB선 꼽고 화면 잠금 해제하고 파일 들어있는 폴더 찾아가서 로딩되는 거 기다리고 하는 게 너무 귀찮다. 요즘에는 또 온라인 개학 때문에 과제한 거 찍어서 제출할 때가 많아졌는데 이 과정을 반복하려니까 진짜..
그리고 좀 귀찮아도 잘 되기라도 하면 괜찮은데 쓰고 있던 케이블이 맛이 가려해서 폰 꼽아놓고 한 1분 지나면 연결 끊기고 또 1분 지나면 끊기는 게 무한반복이라 이대로는 도저히 안 되겠다. 못 참겠다 싶어서 무선 공유 앱을 만들기로 했다.
개발 언어
서버 역할을 할 프로그램은 자바로 개발한다.
내가 제일 잘 다룰 수 있는 언어이기도 하고 안드로이드 앱에서도 그대로 재사용이 가능하기 때문에 선택했다.
따라서 안드로이드 어플 개발도 코틀린이 아닌 자바를 선택했다.
여담으로 코틀린 공부를 좀 하긴 해야겠다.. 요즘 나오는 예제들은 다 코틀린으로 되어있어서 보기가 좀 힘들다..
전송 과정
PC에서 서버를 실행하면 서버 정보를 담은 QR코드를 표시하고 폰에서 앱을 실행하고 QR코드를 찍으면 서버에 연결이 되면서 파일이 전송된다.
통신은 자바에서 기본으로 제공하는 Socket 클래스를 사용하고 기기를 연결하고 파일을 전송하는 과정은 FTP 같은 프로토콜을 직접 설계했다. QR코드 라이브러리는 zxing을 사용하였다.
프로토콜 설계
다른 사람과 대화를 할 때 같은 언어를 사용해야 말이 잘 통한다. 마찬가지로 PC와 휴대폰이 통신을 하기 위해서는 둘 사이에 정해진 규칙이 필요한데, 이걸 '프로토콜'이라고 한다. 예를 들어 웹서핑을 할 때, 웹서버와 사용자 간에는 http 프로토콜을 사용한다. 물론 파일 공유를 할 때 사용하는 프로토콜(ftp, smb 등)이 이미 있지만, 그렇게까지 복잡한 걸 쓸 필요도 없고 뭣보다 직접 만드는 게 재밌으니까 만들어서 쓰기로 했다.
내가 설계한 프로토콜로 파일을 전송하는 과정은 다음과 같다.
일단 안드로이드 폰(지금부터 게스트라고 부름)이 PC(지금부터는 호스트)에 접속하면 먼저 게스트는 자신의 정보를 호스트에 알린다. 여기서 호스트는 게스트가 파일 전송을 목적으로 접속한 건지 확인해야 한다.
처음 접속 시 게스트가 호스트로 보내는 요청은 다음과 같다.
< HELLO
< KEY 234112
< ADDR 192.168.x.x
< NAME my android
< OVER
KEY
뒤의 값은 QR코드에 포함된 데이터 중 하나로 QR코드 없이 서버에 접근하는 걸 막는 역할을 한다.
ADDR
은 게스트의 ip주소, NAME
은 기기 이름을 의미한다.
호스트가 HELLO
요청을 받으면 위 요청을 읽기 시작하고 OVER
요청을 받으면 게스트의 정보가 올바른지 확인한다. KEY
값이 일치하는지 확인하고 일치하면 게스트로 호스트 정보를 전송(답장)하고 게스트로부터 파일을 전송받을 수 있는 상태가 된다.
이때 호스트가 보내는 응답은 다음과 같다.
> HI my android
> IM DESKTOP-f34wq92f2
호스트가 받은 게스트의 정보를 확인차 전송하고, 자신의 추가 정보도 전송한다.
파일 전송을 다음과 같은 과정을 거친다.
- 호스트로 파일 정보를 보낸다.
- 호스트로 데이터 전송 시작 요청을 보낸다.
- 호스트로 파일 바이너리를 보낸다.
- 호스트로 데이터 전송 완료 요청을 보낸다.
- 호스트가 파일을 성공적으로 받았는지 검사한다.
- 파일을 성공적으로 받지 못했다면 게스트에 실패 응답을 보내고 받았으면 성공 응답을 보낸다.
이 과정을 실제 프로토콜로 구현하면 다음과 같다.
< SEND filename
< SIZE 324
< HASH 3b48f7w3h94f87w
< GO
< 1024 ~~~~~~
(위 명령 324번 반복)
< OVER
(해시 검사 실패 시)
> BAD
< SEND filename
< SIZE 324
< HASH 3b48f7w3h94f87w
< GO
< 1024 ~~~~~~
(위 명령 324번 반복)
< OVER
(해시 검사 성공 시)
> GOOD
참고로 <
가 게스트에서 호스트로, >
가 호스트에서 게스트로 보내는 요청이다.
호스트가 SEND
를 받으면 파일 정보를 받기 시작하고 GO
를 받으면 그때부터 게스트가 데이터를 전송하기 시작한다.
파일 정보는 파일 크기와 파일의 해시를 전송하며 파일 크기는 KB 단위로, 해시 함수는 sha256을 사용한다.
파일 전송이 끝나면 게스트는 종료 요청을 보낸다.
< BYE
> BYE
다음 글에서 계속