문제

휴대 전화 (클라이언트)에서 J2ME 앱이 실행 중입니다.

서버와의 HTTP 연결을 열고 서버에서 업데이트 된 정보에 대한 폴링을 유지하고 싶습니다.

수행 된 모든 여론 조사는 GPRS 바이트를 사용하며 GPRS 청구는 전송 및받은 패킷을 기반으로하기 때문에 장기적으로 비싸게됩니다. HTTP 프로토콜을 사용하여 바이트 효율적인 폴링 방법이 있습니까?.

나는 또한 긴 여론 조사에 대해 들었지만 그것이 어떻게 작동하는지, 얼마나 효율적인지 잘 모르겠습니다.

실제로 서버가 전화 앱에 새로운 데이터를 사용할 준비가되었다고 말하는 것입니다. 폴링이 수행 될 필요가 없지만 특히 J2ME에서는 이러한 기술을 알지 못합니다.

도움이 되었습니까?

해결책

HTTP 만 사용 하여이 문제를 해결하려면 긴 여론 조사 가장 좋은 방법이 될 것입니다. 매우 쉽습니다. 먼저 알림을 위해 서버 측에서 URL을 설정해야합니다 (예 : http://example.com/notify), 그리고 알림 프로토콜을 정의합니다. 프로토콜은 단순히 일부 텍스트 라인만큼이나 마찬가지로 각 줄이 이벤트 일 수 있습니다. 예를 들어,

  MSG user1
  PHOTO user2 album1
  EMAIL user1
  HEARTBEAT 300

전화의 폴링 스레드는 다음과 같이 작동합니다.

  1. 알림 URL에 HTTP 연결을 만듭니다. J2ME에서는 gcf httpconnection을 사용할 수 있습니다.
  2. 푸시 할 이벤트가 없으면 서버가 차단됩니다.
  3. 서버가 응답하는 경우 각 줄을 가져 와서 새 스레드를 스폰하여 응용 프로그램에 알리고 루프백이 #1로 연결됩니다.
  4. 어떤 이유로 든 연결이 닫히면 잠시 잠을 자고 1 단계로 돌아갑니다.

구현 세부 정보에주의를 기울여야합니다.

  1. 클라이언트와 서버 모두에서 HTTP 타임 아웃을 조정하십시오. 시간 초과가 길수록 효율적입니다. 시간 초과 연결은 재 연결을 유발합니다.
  2. 휴대 전화와 서버 모두에서 HTTP KeepAlive를 활성화하십시오. TCP의 3 방향 핸드 셰이크는 GPRS 용어로 비싸므로 피하십시오.
  3. 오래된 연결을 감지하십시오. 모바일 환경에서는 오래된 HTTP 연결을 얻는 것이 매우 쉽습니다 (연결이 사라졌지 만 폴링 스레드는 여전히 기다리고 있습니다). 하트 비트를 사용하여 회복 할 수 있습니다. 하트 비트 비율이 5 분이라고 가정 해보십시오. 서버는 5 분마다 알림을 보내야합니다. 밀어 넣을 데이터가 없으면 하트 비트를 보내십시오. 전화에서 폴링 스레드는 5 분 동안받지 않으면 폴링 연결을 닫고 다시 열려고 노력해야합니다.
  4. 연결 오류를 신중하게 처리합니다. 연결 문제가있는 경우 긴 폴링이 잘 작동하지 않습니다. 제대로 처리되지 않으면 거래 차단기가 될 수 있습니다. 예를 들어, 수면이 충분하지 않은 경우 4 단계에서 많은 패킷을 낭비 할 수 있습니다. 가능하면 전화기에서 GPRS 가용성을 확인하고 배터리를 절약 할 수없는 GPRS를 사용할 수 없을 때 폴링 스레드를 보류하십시오.
  5. 제대로 구현하지 않으면 서버 비용이 매우 높을 수 있습니다. 예를 들어, Java Servlet을 사용하는 경우 모든 실행중인 응용 프로그램에는 하나 이상의 해당 폴링 연결과 스레드가 있습니다. 사용자의 수에 따라 Tomcat을 빠르게 죽일 수 있습니다 :) Apache Mina와 같은 자원 효율적인 기술을 사용해야합니다.

SMS 및 일부 IP 수준의 트릭을 사용하는 것과 같이 전화로 알림을 푸시하는 다른보다 효율적인 방법이 있다고 들었습니다. 그러나 당신은 약간의 수준의 포트 불가능한 프로그래밍을 수행하거나 특허 위반의 위험에 처해야합니다. 긴 폴링은 아마도 HTTP 전용 솔루션으로 얻을 수있는 최고 일 것입니다.

다른 팁

"폴링"이 무슨 뜻인지 정확히 알지 못합니다. Imap 유휴? 연결이 열려 있으며 연결 자체를 계속해서 구축하기위한 오버 헤드가 없습니다. 언급 한 바와 같이, 또 다른 가능한 솔루션은 HTTP 요청의 헤드 헤더입니다 (잊어 버렸습니다. 감사합니다!).

이것에 대해 살펴보십시오 지도 시간 J2ME에서 HTTP 연결의 기본.

푸시 지원이없는 응용 프로그램/장치로 데이터를 푸시하는 것은 불가능합니다.

그만큼 헤드 HTTP 요청 페이지가 변경되었는지 여부를 확인하려면 HTTP가 제공하는 방법입니다. 브라우저와 프록시 서버에서는 많은 대역폭을 소비하지 않고 페이지가 업데이트되었는지 여부를 확인하기 위해 브라우저와 프록시 서버에서 사용합니다.

HTTP 용어로, 헤드 요청은 신체없이 얻는 것과 동일합니다. 나는 이것이 여론 조사가 자주 발생하지 않으면 허용되는 수백 바이트 일 뿐이라고 생각합니다.

이를 수행하는 가장 좋은 방법은 소켓 연결을 사용하는 것입니다. Gmail과 같은 많은 응용 프로그램이 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top