Pergunta

É claro que conheço o Ajax, mas o problema com o Ajax é que o navegador deve pesquisar o servidor com frequência para descobrir se há novos dados.Isso aumenta a carga do servidor.

Existe algum método melhor (mesmo usando Ajax) além de pesquisar o servidor com frequência?

Foi útil?

Solução

Sim, o que você procura é COMET http://en.wikipedia.org/wiki/Comet_(programação).Outros bons termos do Google para pesquisar são AJAX-push e reverse-ajax.

Outras dicas

Sim, é chamado Ajax reverso ou Cometa.Comet é basicamente um termo abrangente para diferentes maneiras de abrir solicitações HTTP de longa duração para enviar dados em tempo real para um navegador da web.eu recomendaria Servidor Push StreamHub, eles têm algumas demonstrações interessantes e é muito mais fácil de começar do que qualquer outro servidor.Confira a Tutorial de primeiros passos com Comet e StreamHub para uma introdução rápida.Você pode usar a Community Edition, que está disponível para download gratuitamente, mas é limitada a 20 usuários simultâneos.A versão comercial vale a pena apenas pelo suporte, além de você obter adaptadores de cliente SSL e Desktop .NET e Java.A ajuda está disponível através do Grupo do Google, há um bom monte de tutoriais na rede e há um Adaptador GWT Comet também.

Hoje em dia você deve usar WebSockets.Este é o padrão de 2011 que permite iniciar conexões com HTTP e depois atualizá-las para comunicação bidirecional baseada em mensagens cliente-servidor.

Você pode iniciar facilmente a conexão a partir de javascript:

var ws = new WebSocket("ws://your.domain.com/somePathIfYouNeed?args=any");
ws.onmessage = function (evt) 
{
  var message = evt.data;
  //decode message (with JSON or something) and do the needed
};

O manuseio do lado do servidor depende da sua pilha de tecnologia.

Olhe no cometa (uma paródia sobre o fato de que o Ajax é um agente de limpeza e o cometa), que é basicamente "Ajax reverso". Esteja ciente de que isso requer uma conexão de servidor de longa duração para cada usuário receber notificações, portanto, esteja ciente das implicações de desempenho ao escrever seu aplicativo.

http://en.wikipedia.org/wiki/Comet_(programação)

Cometa é definitivamente o que você deseja.Dependendo dos requisitos de linguagem/estrutura, existem diferentes bibliotecas de servidor disponíveis.Por exemplo, WebSync é um servidor Comet integrado ao IIS para desenvolvedores ASP.NET/C#/IIS, e também há vários outros servidores autônomos se você precisar de uma integração mais estreita com outras linguagens.

Eu sugiro fortemente que você invista algum tempo no Comet, mas não conheço uma implementação ou biblioteca real que você possa usar.

Para uma espécie de "painel de controle de callcenter" de um aplicativo da web que envolvia a atualização do status do agente e da fila de chamadas para um callcenter ativo, desenvolvemos uma solução interna que funciona, mas está longe de ser uma biblioteca que você possa usar.

O que fizemos foi implementar um pequeno serviço no servidor que conversa com a central telefônica, aguarda novos eventos e mantém uma fotografia da situação.Este serviço fornece um pequeno servidor web.

Nossos web-clientes se conectam via HTTP a este servidor web e pedem a última foto (codificada em XML), exibem e depois vão novamente, pedindo a nova foto.O servidor web neste momento pode:

  • Devolva a nova foto, se houver
  • Bloqueie o cliente por alguns segundos (30 em nosso setup) aguardando algum evento ocorrer e altere a fotografia.Se nenhum evento foi gerado naquele momento, ele retorna a mesma foto, apenas para permitir que a conexão permaneça ativa e não limite o tempo limite do cliente.

Dessa forma, quando o cliente faz uma pesquisa, ele obtém uma resposta em no máximo 0 a 30 segundos.Se um novo evento já foi gerado ele o obtém imediatamente), caso contrário ele bloqueia até que um novo evento seja gerado.

É basicamente uma pesquisa, mas é uma pesquisa inteligente para não superaquecer o servidor da web.Se Comet não for sua resposta, tenho certeza de que isso poderia ser implementado usando a mesma ideia, mas usando AJAX mais extensivamente ou codificação em JSON para obter melhores resultados.Isso foi projetado na era pré-AJAX, portanto, há muito espaço para melhorias.

Se alguém puder fornecer uma implementação leve e real disso, ótimo!

Uma alternativa interessante ao Comet é usar soquetes no Flash.

Ainda outra maneira padrão é SSE (Server-Sent Events, também conhecido como EventSource, após o objeto JavaScript).

O cometa foi na verdade cunhado por Alex Russell do Dojo Toolkit ( http://www.dojotoolkit.org ).Aqui está um link para mais informações http://cometdproject.dojotoolkit.org/

Existem outros métodos.Não tenho certeza se eles são "melhores" na sua situação.Você poderia ter um miniaplicativo Java que se conecta ao servidor no carregamento da página e espera que o material seja enviado pelo servidor.Seria um pouco mais lento na inicialização, mas permitiria que o navegador recebesse dados do servidor com pouca frequência, sem pesquisa.

Você pode usar um aplicativo Flash/Flex no cliente com BlazeDS ou LiveCycle no lado do servidor.Os dados podem ser enviados ao cliente usando uma conexão RTMP.Esteja ciente de que o RTMP usa uma porta não padrão.Mas você pode facilmente voltar à pesquisa se a porta estiver bloqueada.

É possível alcançar o que você deseja através do uso de conexões http persistentes.

Confira a Artigo sobre cometa na Wikipedia, é um bom lugar para começar.

Você não está fornecendo muitas informações, mas se estiver pensando em construir algum tipo de site orientado a eventos (a'la digg spy) ou algo parecido com isso, provavelmente estará pensando em implementar um IFRAME oculto que se conecta a um URL onde a conexão nunca fecha e então você enviará tags de script do servidor para o cliente para realizar as atualizações.

Pode valer a pena conferir Servidor Meteoro que é um servidor web projetado para COMET.Legal demonstração e também é usado por Twitterfall.

Depois que uma conexão é aberta com o servidor, ela pode ser mantida aberta e o servidor pode enviar conteúdo por push há muito tempo atrás, eu fiz usando multipart/x-mixed-replace mas isso não funcionou no IE.

Acho que você pode fazer coisas inteligentes com a pesquisa que faz com que funcione mais como push, não enviando cabeçalhos de conteúdo inalterados, mas deixando a conexão aberta, mas nunca fiz isso.

Você poderia experimentar o nosso Componente Cometa - embora seja extremamente experimental...!

por favor verifique esta biblioteca https://github.com/SignalR/SignalR saber como enviar dados aos clientes de forma dinâmica à medida que ficam disponíveis

Você também pode pesquisar Pushlets Java se você estiver usando páginas jsp.

Talvez você queira dar uma olhada HTTP reverso também.

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