Pergunta

Tenho um aplicativo J2ME em execução no meu celular (cliente),

Gostaria de abrir uma conexão HTTP com o servidor e continuar pesquisando informações atualizadas no servidor.

Cada pesquisa realizada consumirá bytes GPRS e se tornaria cara no longo prazo, já que a cobrança do GPRS é baseada em pacotes enviados e recebidos.Existe uma maneira eficiente de pesquisar bytes usando o protocolo HTTP?

Também ouvi falar de pesquisas longas, mas não tenho certeza de como funcionam e quão eficientes seriam.

Na verdade, a maneira preferida seria o servidor informar ao aplicativo de telefone que novos dados estão prontos para serem usados, dessa forma não será necessário fazer polling, porém não conheço essas técnicas, especialmente em J2ME.

Foi útil?

Solução

Se você quiser resolver este problema usando apenas HTTP, sondagem longa seria o melhor caminho.É bastante fácil.Primeiro você precisa configurar uma URL no servidor para notificação (por exemplo, http://example.com/notify) e definir um protocolo de notificação.O protocolo pode ser tão simples quanto algumas linhas de texto e cada linha é um evento.Por exemplo,

  MSG user1
  PHOTO user2 album1
  EMAIL user1
  HEARTBEAT 300

O tópico de pesquisa no telefone funciona assim,

  1. Faça uma conexão HTTP com o URL de notificação.No J2ME, você pode usar GCF HttpConnection.
  2. O servidor irá bloquear se não houver eventos para enviar.
  3. Se o servidor responder, obtenha cada linha e gere um novo thread para notificar o aplicativo e fazer loopback para #1.
  4. Se a conexão for encerrada por algum motivo, durma um pouco e volte para a etapa 1.

Você deve prestar atenção aos seguintes detalhes de implementação,

  1. Ajuste os tempos limite de HTTP no cliente e no servidor.Quanto maior o tempo limite, mais eficiente.A conexão expirada causará uma reconexão.
  2. Habilite o keepalive HTTP no telefone e no servidor.O handshake de três vias do TCP é caro no termo GPRS, então tente evitá-lo.
  3. Detecte conexões obsoletas.Em ambientes móveis, é muito fácil obter conexões HTTP obsoletas (a conexão acabou, mas o thread de pesquisa ainda está aguardando).Você pode usar batimentos cardíacos para se recuperar.Digamos que a frequência cardíaca seja de 5 minutos.O servidor deve enviar uma notificação a cada 5 minutos.Se não houver dados para enviar, basta enviar HEARTBEAT.No telefone, o thread de polling deve tentar fechar e reabrir a conexão de polling se nada for recebido por 5 minutos.
  4. Lidando com erros de conectividade com cuidado.A sondagem longa não funciona bem quando há problemas de conectividade.Se não for tratado adequadamente, pode ser o obstáculo.Por exemplo, você pode desperdiçar muitos pacotes na Etapa 4 se o sono não for longo o suficiente.Se possível, verifique a disponibilidade do GPRS no telefone e coloque a pesquisa em espera quando o GPRS não estiver disponível para economizar bateria.
  5. O custo do servidor pode ser muito alto se não for implementado corretamente.Por exemplo, se você usar o servlet Java, cada aplicativo em execução terá pelo menos uma conexão de pesquisa correspondente e seu encadeamento.Dependendo do número de usuários, isso pode matar um Tomcat rapidamente :) Você precisa usar tecnologias eficientes em termos de recursos, como o Apache Mina.

Disseram-me que existem outras maneiras mais eficientes de enviar notificações para o telefone, como usar SMS e alguns truques de nível IP.Mas você terá que fazer alguma programação não portátil de baixo nível ou correrá riscos de violações de patentes.A pesquisa longa é provavelmente o melhor que você pode obter com uma solução somente HTTP.

Outras dicas

Não sei exatamente o que você quer dizer com "sondagem", você quer dizer algo como IMAP INATIVO?Uma conexão permanece aberta e não há sobrecarga para construir a própria conexão repetidas vezes.Conforme afirmado, outra solução possível é o cabeçalho HEAD de uma solicitação HTTP (esqueci, obrigado!).

Olhe para isso tutorial para o básico de conexões HTTP em J2ME.

Não é possível enviar dados para um aplicativo/dispositivo sem suporte Push (como um Blackberry).

O Solicitação HTTP HEAD é o método que o HTTP fornece se você deseja verificar se uma página foi alterada ou não, é usado por navegadores e servidores proxy para verificar se uma página foi atualizada ou não sem consumir muita largura de banda.

Em termos HTTP, a solicitação HEAD é igual a GET sem o corpo. Presumo que seriam apenas algumas centenas de bytes, no máximo, o que parece aceitável se suas pesquisas não forem muito frequentes.

A melhor maneira de fazer isso é usar a conexão de soquete.Muitos aplicativos como o GMail os utilizam.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top