2009-08-08 3 views
4

에서 HTTP 서버가 내 휴대 전화 (클라이언트)에서 실행되는 J2ME 응용 프로그램, I는 서버와 HTTP 연결을 열고 서버에 업데이트 된 정보에 대한 폴링을 유지하고 싶은폴링은 J2ME 클라이언트

있습니다.

수행 된 모든 설문 조사는 GPRS 바이트를 사용하며, GPRS 청구가 송수신 된 패킷을 기반으로하기 때문에 장기적으로 비싸게 보일 것입니다. HTTP 프로토콜을 사용하여 효율적인 바이트 폴링 방법이 있습니까?

나는 긴 폴링 (polling)에 대해서도 들었지만, 그것이 어떻게 작동하고 얼마나 효율적인지는 잘 모른다.

실제로 서버가 전화 응용 프로그램에 폴링을 수행 할 필요가 없도록 새 데이터를 사용할 준비가되었음을 알리는 것이 좋겠지 만 특히 J2ME에서는 이러한 기술을 알지 못합니다 .

답변

6

HTTP 만 사용하여이 문제를 해결하려면 long polling이 가장 좋습니다. 상당히 쉽습니다. 먼저 알림을 위해 서버 측에 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. 조정 HTTP가 모두 클라이언트에서 시간 초과 당신은 다음과 같은 구현 세부 사항에주의를 지불해야 1.

    을 단계로 돌아갑니다 경우 및 서버. 타임 아웃이 길수록 효율성이 높아집니다. 시간 초과 된 연결로 인해 다시 연결됩니다.

  5. 전화와 서버 모두에서 HTTP 연결 유지를 사용합니다. TCP의 3 방향 핸드 셰이크는 GPRS 용어로 비싸므로 피해야합니다.
  6. 부실 연결을 감지합니다. 모바일 환경에서는 오래된 HTTP 연결 (연결은 끊어졌지만 폴링 스레드는 여전히 대기 중임)을 얻는 것은 매우 쉽습니다. 하트 비트를 사용하여 복구 할 수 있습니다. 하트 비트 속도가 5 분이라고합시다. 서버는 5 분마다 알림을 보내야합니다. 푸시 할 데이터가 없으면 HEARTBEAT 만 보냅니다. 폴링 스레드는 5 분 동안 아무 것도 수신되지 않으면 폴링 연결을 닫고 다시 열려고 시도합니다.
  7. 연결 오류를 신중하게 처리합니다. 연결 문제가있을 때 Long 폴링이 제대로 작동하지 않습니다. 제대로 처리하지 않으면 거래가 될 수 있습니다. 예를 들어, 수면 시간이 충분하지 않으면 4 단계에서 많은 패킷을 낭비 할 수 있습니다. 가능한 경우 GPRS를 사용하여 배터리를 절약 할 수없는 경우 전화의 GPRS 가용성을 확인하고 폴링 스레드를 보류 상태로 설정하십시오.
  8. 제대로 구현되지 않으면 서버 비용이 매우 높아질 수 있습니다. 예를 들어 Java 서블릿을 사용하는 경우 실행중인 모든 응용 프로그램에는 적어도 하나의 해당 폴링 연결과 해당 스레드가 있습니다. 사용자 수에 따라 Tomcat을 빠르게 종료시킬 수 있습니다. Apache Mina와 같은 자원 효율적인 기술을 사용해야합니다.

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

+0

좋은 답변!, 그러나 나는 다음에 관해서 이해하지 못했습니다 : 1. 무슨 뜻인가요? 2. 심장 박동이란 무엇입니까? 3. Tomcat에는 활성 사용자 수에 대한 제한이 있습니까? –

+1

답변 : 1. 아무 것도 밀지 않으면 연결을 유지하고 이벤트를 기다리고 싶습니다. BlockingQueue를 확인하십시오. 2. 하트 비트는 서버가 살아 있음을 전화기에 알리는 관리 패킷입니다. 전화가 너무 오래 걸리면 전화를 보내서 부적절한 연결 복구 모드로 들어가는 것을 피하십시오. 이는 더 비쌉니다. 3. Tomcat과 같은 서블릿의 경우 각 HTTP 요청은 스레드입니다. 스레드의 수는 실행중인 응용 프로그램의 수와 같습니다. 최대 값은 구성 가능하지만 숫자가 너무 높으면 서버가 작동하지 않습니다. 나는 수천이 아니라 수백에 머물려고 노력할 것이다. –

1

HEAD HTTP request은 페이지가 변경되었는지 여부를 확인하려는 경우 HTTP를 제공하는 방법으로 브라우저 및 프록시 서버가 많은 대역폭을 소비하지 않고 페이지가 업데이트되었는지 여부를 확인하는 데 사용됩니다.

HTTP 요청에서 HEAD 요청은 본문없이 GET과 동일합니다. 설문 조사가 자주없는 경우 HEAD 요청은 수 백 바이트 만 허용됩니다.

2

"폴링"이 무슨 뜻인지 정확히 모르겠습니까? IMAP IDLE과 같은 것을 의미합니까? 연결이 열린 상태로 유지되며 연결 자체를 반복해서 구축하기위한 오버 헤드가 없습니다. 앞에서 설명한 것처럼 또 다른 가능한 해결책은 HTTP 요청의 HEAD 헤더입니다 (잊어 버렸습니다, 감사합니다!).

J2ME의 기본 HTTP 연결은이 tutorial을 살펴보십시오.

푸시 지원 (예 : 블랙 베리)이없는 응용 프로그램/장치로 데이터를 푸시 할 수 없습니다.

+0

폴링은 서버를 쿼리하거나 일정 간격으로 요청하는 것입니다. 예를 들어 클라이언트는 "내 데이터가 준비 되었습니까?"라는 좀 더 일반적인 의미로 묻습니다. 또는 "우리가 마지막으로 말한 이후로 변경된 사항이 있습니까?" 쿼리는 기술적 인 의미와 서버가 이해할 수있는 언어로 수행됩니다. –

+0

다음 HEAD 헤더를 사용하십시오. –

+1

HEAD가 HTTP 내용을 다시 보내지는 않지만 (본체 없음) GPRS 트래픽을 저장하는 것이 목표 인 경우 비용이 많이 듭니다. 양탄자 아래에서 많은 일이 발생해야합니다 (3 방향 TCP 핸드 셰이크, 모든 헤더에 대한 요청 및 응답). 메시지가 작 으면 GET과 아무런 차이가 없습니다. –

1

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

+0

참조가 있으십니까? 어쩌면 AJAX 코드가 우리에게 이것을 보여줄 수 있습니까? –

+1

샘플 앱을 만들려고했습니다 : Midlet이 서버를 청취하고 있습니다 (Ruby로 작성된 예제를 사용했습니다). "0"을 눌러 응용 프로그램을 최소화 할 수 있습니다. 일부 메시지가 수신되면 응용 프로그램 팝업이 표시됩니다. http://depositfiles.com/files/68ix6gskv (죄송합니다. 파일 첨부 방법을 모릅니다.) –