마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

웹 서버에서 연결 요청하지 않은 안드로이드 단말로 통신

0 추천
안녕하세요.

제가 지금 만들고 있는 프로그램은 이렇습니다.

안드로이드 단말 여러 대와 웹 서버(파이썬 Flask) 한 대가 있습니다.

웹 서버의 디비에는 안드로이드 단말 각각에 대한 정보가 저장되어 있습니다.

안드로이드 A가 웹 서버에 안드로이드 B에 대한 자료를 요청하면 이 웹 서버는 안드로이드 B에게 정보 공개 허락 여부를 묻습니다.

안드로이드 B가 웹 서버로 부터 요청을 받으면 B는 A의 정보를 확인하고 A에게 정보 공개를 원하면 '허락'을, 원하지 않으면 '불허'를 웹 서버에 전달합니다.

웹 서버는 안드로이드 B의 허락 여부를 받아 '허락'이면 자료를 요청했던 안드로이드 A에게 안드로이드 B의 정보를 넘겨줍니다.

문제는 통신 방법입니다.

현재 구상하고 있는 방법은 안드로이드 A에서 HTTP로 웹 서버에 정보를 요청하고 웹 서버는 안드로이드 B에 소켓 통신으로 연결해 허락 여부를 받고 난 후 안드로이드 A에 HTTP로 값을 반환하는 방식입니다.

질문드리겠습니다.

1. 웹 서버에서 안드로이드 B에 연결을 요청할 때 소켓으로 통신하면 안드로이드 B가 언제 응답할 지 모르는 상황에서 양쪽 모두 소켓이 계속 열려있어 웹 서버의 자원이 너무 낭비되지 않나요? 다수의 안드로이드 단말이 동시에 웹 서버에 접근해서 다른 단말의 정보를 요구하는 상황을 가정하면 낭비가 더 심할 것 같다는 생각이 듭니다.

2. 보통의 경우처럼 웹 서버에서 연결을 요청한 단말에 값을 리턴하는 것이 아닌, 웹 서버에서 먼저 연결 요청을 하지 않은 안드로이드 B에 연결을 요청하여 그 단말로 부터 리턴값을 받아야 할 때 보통 어떤 프로토콜을 사용하나요? 즉, 웹 서버에서 안드로이드 단말 방향으로 통신 요청을 할 때 주로 어떤 방식을 사용하나요? HTTP도 사용하나요? HTTP를 사용하게 된다면 안드로이드 B는 HTTP 서버로 역할을 하며 항상 포트를 열어두어야 하지 않나요?

웹 서버가 다시 클라이언트가 되어 안드로이드 단말로 연결 요청을 하는 프로그램은 처음인지라 잘 모르겠네요.

고수님들 답변 부탁드립니다.
예압 (170 포인트) 님이 2016년 4월 27일 질문

1개의 답변

0 추천
구조에 문제가 있어보입니다.

A가 요청한 시점에 B에게 공개여부를 묻지 말고, 그냥 미리 공개 여부를 받아놓으면 복잡하지 않은 구조로 만들 수 있습니다.
익명사용자 님이 2016년 4월 27일 답변
타 단말로의 공개 여부를 받아와서 데이터베이스에 플래그 형식으로 두려고 했으나 요구사항이 위와 같은 방식이라 그 해결책을 찾고 있습니다.
이 내용대로라면 B가 A에게 정보공개 여부를 결정하기 위해서는 B는 A의 정보를 알고 있어야 하며, 따라서 그전에 미리 A는 B에게 자신의 정보를 공개한다고 설정이 되어 있어야 합니다.
즉 A가 B의 정보를 받기 위해서는 A는 B에게 자신의 정보를 미리 공개해 놓아야 합니다.

요구사항이 이상해보입니다.
잘못하면 만들어놔도 쓰지 못하게 될 수 있습니다.
좀 더 정확히 말씀드리면 데이터베이스에는 안드로이드 B와 그 친구들에 대한 정보만이 저장되어 있고, 안드로이드 A와 그 친구들은 데이터베이스에 정보가 저장되어 있지 않은 외부인입니다.
즉, 외부인 안드로이드 A가 웹 서버에 안드로이드 B에 대한 정보를 요구하면 웹 서버는 안드로이드 B에 연결 요청을 하여 안드로이드 A의 IP 주소를 넘겨주며, 안드로이드 B는 전해받은 IP에 대해 정보를 공개할 것인지를 체크하여 공개 여부를 다시 웹 서버로 넘겨주려고 합니다.

이렇게 구현하기 힘들다면 어떤 방식으로 해당 요구사항을 구현할 수 있을까요? 안드로이드 A가 안드로이드 B에게 정보 공개 여부를 요구하는 시점에 안드로이드 B의 화면에 안드로이드 A가 정보 공개를 요청한다는 메시지가 떠야 합니다.

웹 서버에서 웹 서버에 연결 요청을 먼저 하지 않은 안드로이드 B에게 연결 요청을 하는 부분도 의문입니다. 웹 서버가 다시 클라이언트가 되어야 한다는 것인데, 실제 개발할 때도 이런 경우가 있나요?
사용자 입장에서 생각해보시기 바랍니다.

자기 폰 화면에 "111.222.333.444 IP 기기에서 귀하의 정보 공유를 요청합니다. 공유하시겠습니까?" 라는 메시지가 표시된다면 과연 공유한다고 하는 사용자가 얼마나 될까요?
누구인지도 모르는데 공유를 할리가 없지요.
당연한 말씀이십니다. 하지만 러프하게 말씀드렸을 때 그렇다는 것입니다.
실제로는 A의 이름이나 다른 정보를 이용할 생각입니다.
위의 요구사항들을 어떤 식으로 하면 구현할 수 있을까요?
...