안녕하세요..
지금 서버에서 폰으로 파킷을 내려보내는데 폰의 화면이 켜있는상태에서는 아무 문제 없이 파킷을 받는데 폰이 절전모드로 들어가면 파킷을 받지 못합니다.
소켓파킷을 받는부분은 스레드로 만들고 받은 파킷의 타입에따라 핸들러로 메세지를 전송하는방식으로 처리하였습니다.
이문제 때문에 몇일을 고생하고 있습니다...
꼭 답변 부탁드립니다...
좋은 하루 되세요,,,,
저도 같은문제로 며칠 고생했는데
확실하진 않지만 참고는 해보세요.
혹시 binder같은거 사용하시거나
패킷을 받았을때 실행되는 메서드가 있나요?
거기서 wakelock을 걸어주시면 됩니다.
저는 소켓은 죄다 스레드로 때려넣고
나머지 처리는 모두 서비스로 하고 있습니다.
연결 자체는 스레드지만 반응하는건 서비스인 형식으로 설계하시는게 편합니다.
경험상(얼마 안되지만) 뭔가 수신했을때 반응하는걸 스레드로 만들면 꼬여버리더군요.
스레드의 세계는 심오합니다...=ㅁㅜ
지금 말씀하신게... C2DM이라는 걸 이용하셔야 합니다. 디바이스에서 서버에 데이터를 요청하는게 아니고.. 서버에서 디바이스에게 데이터를 주려는 상황에서는요..
C2DM을 사용하기가 어려운 상황이면..
서비스에서 일정시간 간격으로 풀링해주는 방법밖에는 없습니다.
서비스 내에서 핸들러나 어싱크타스크를 쓰면 되고... 알람을 이용해서 리시버로 구현 해도 되긴 합니다..
헤드샷님께서 말씀하신건 "폴링" 이라는 방식입니다.
구현도 편하고 비용도 거의 들지않지만
서버쪽의 트래픽이 많이 발생하며 단말기의 배터리 문제도 발생합니다.
당연히 리소스도 계속 쌓이면서 서비스는 무거워지고, 휴대폰이 다운되어 버리는 문제를 야기합니다.
비교적 쉽게 사용하실 수 있는 프로토콜으로 mqtt라는게 있습니다.
ibm에서 오픈소스로 만든 프로젝트인데, c2dm과 다르게 서버를 자체적으로 만들어야 하지만
꽤 안정적이고, 가볍습니다. 구현도 그리 어렵진 않습니다.
다만 제대로 사용하려면 예제 소스에서 어느 정도의 커스터마이징을 해줘야 합니다.
이걸 사용하면 질문자님께서 고민하시는 소켓 부분에 대해서도 어느정도 감을 잡으실 수 있을겁니다.
예제소스에 보면 연결은 어떤식으로 정의하는지, 뭔가 받았을때 어떤식으로 처리되는지 잘 나와 있습니다.
주석까지 포함해서 친절하게 설명되어 있더군요.
안녕하세요.
저도 mqtt로 서비스를 구현해 보았습니다.
그런데 서버를 내식대로 만들어서 폰과 연동을 하려고 하는데 파킷을 받는부분이 잘 않되더군요,,,
mqtt에서 쓰는 방식대로 알람매니저로 keep_alive파킷도 올려보내면서 구현했는데 받는부분은 mqtt에서는 콜백으로 구현하다나니 그부분을 어떻게 구현했는지 감이 않옵니다.
이것땜에 절전모드상에서는 서버에서 폰에 파킷을 내려보내면 응답을 아예하지 않습니다.
한 5분정도는 제대로 받는데 그후로는 아예 받지를 못합니다.
꼭 해결법을 알려주세요...
감사합니다.




절전모드나 대기상태에서는 서비스라는 기능을 사용하셔야 되는걸로 압니다. 백그라운드에서 프로세스가 계속 돌아야 할때 그걸 사용한다고 들었어요,