Existe alguma maneira de enviar dados do servidor da web para o navegador?

134

É claro que estou ciente do 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 o Ajax) além de pesquisar o servidor com frequência?

Niyaz
fonte
1
Não tenho certeza se existe. Para torná-lo conceitualmente mais simples para o aplicativo, acho que você pode implementar uma camada de transporte sobre as solicitações de pesquisa e, assim, remover a responsabilidade de pesquisa da lógica da sua aplicação. Talvez alguém já tenha implementado isso? <strong> Edit: </strong> Aparentemente, é chamado <a href=" en.wikipedia.org/wiki/Reverse_Ajax"> Ajax reverso </a> e <a href = " en.wikipedia.org/wiki/Comet_ ( programação) "> Cometa </ ​​a >, mas até agora parece que você precisa implementá-lo. Uma biblioteca JavaScript para isso, alguém?
Anders Sandvig
1
@ Rachel - Atualizações ao vivo para que você possa ver o que os outros estão fazendo. Bom para sites como o StackOverflow e para aplicativos da Web para colaboração como o Google Docs.
Itai Bar-Haim
1
Qualquer pessoa que faça esse tipo de coisa em 2016 provavelmente achará que os websockets são a melhor escolha para esse tipo de comunicação.
Shadow

Respostas:

37

Sim, chama-se Reverse Ajax ou Cometa . Cometa é basicamente um termo genérico para diferentes maneiras de abrir solicitações HTTP de longa duração, a fim de enviar dados em tempo real para um navegador da web. Eu recomendo o StreamHub Push Server , eles têm algumas demos legais e é muito mais fácil começar do que qualquer outro servidor. Confira o Tutorial de introdução ao cometa e ao StreamHub para obter uma introdução rápida. Você pode usar a Community Edition, 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 no Grupo do Google, há muitos tutoriais na rede e também há um adaptador GWT Comet .

Nosrama
fonte
1
Definitivamente o caminho a percorrer, uma vez que você entrar em implementá-lo se você percebe o quanto há para fazer - reconexão, a longo votação, streaming de iframes, suporte cross-browser, HTTPS ...
Corehpf
2
Uma explicação do que Comet é ajudaria esta resposta
Kevin Monk
1
@Satir: adicionada uma explicação rápida. Outras respostas têm links para o artigo da Wikipedia.
Nosrama
32

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

Você pode iniciar facilmente a conexão do 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.

pafinde
fonte
2
Vs eventos enviados pelo servidor: stackoverflow.com/questions/5195452/...
Ciro Santilli郝海东冠状病六四事件法轮功
8
Eu concordo totalmente ... Usar HTTP para comunicação bidirecional é como pensar em chamadas REST para fazer Mario pular em conchas de tartarugas ... é insanidade. Você NÃO PRECISA fazer solicitações e aguarda respostas por um simples botão empurra as pessoas ... Você simplesmente não. HTTP é um protocolo de documento. Protocolo de Transferência de Hipertexto. O Ajax Push é uma maneira incrivelmente complexa de contornar o HTTP para fazer o que o WebSocket faz por design. Pare de ser pateta e use a ferramenta certa para o trabalho.
21416 Nick Steele
você realmente gosta de elipses e, às vezes, uma nova forma de quatro pontos que chamarei de "elipsos"!
Imbatman>
10

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

http://en.wikipedia.org/wiki/Comet_(programming)

Dan Herbert
fonte
5

Eu sugeriria fortemente investir 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 do callcenter" de um aplicativo 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 uma biblioteca que você poderia usar.

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

Nossos clientes da Web se conectam via HTTP a este servidor da Web e solicitam a última foto (codificada em XML), a exibem e depois continua novamente, solicitando a nova foto. O servidor da web neste momento pode:

  • Retorne a nova foto, se houver uma
  • Bloqueie o cliente por alguns segundos (30 em nossa configuração), aguardando a ocorrência de algum evento e altere a fotografia. Se nenhum evento foi gerado nesse ponto, ele retornará a mesma foto, apenas para permitir que a conexão permaneça ativa e não exceda o tempo limite do cliente.

Dessa forma, quando os clientes fazem pesquisas, obtém uma resposta em 0 a 30 segundos no máximo. Se um novo evento já foi gerado, ele será obtido imediatamente); caso contrário, ele será bloqueado até que um novo evento seja gerado.

É basicamente pesquisa, mas é um pouco 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 mais extensivamente AJAX ou codificando em JSON para obter melhores resultados. Isso foi projetado antes da era AJAX, para que haja muito espaço para melhorias.

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

Pablo Alsina
fonte
5

Uma alternativa interessante ao Comet é usar soquetes no Flash.

Gilles
fonte
2

Existem outros métodos. Não tenho certeza se eles são "melhores" na sua situação. Você pode ter um applet Java que se conecta ao servidor no carregamento da página e aguarda o envio de itens 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.

Kibbee
fonte
2

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 voltar facilmente às pesquisas se a porta estiver bloqueada.

Buzzy
fonte
2

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

Confira o artigo do Cometa na wikipedia, esse é um bom lugar para começar.

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

Markus Olsson
fonte
1

Depois que uma conexão é aberta para o servidor, ela pode ser mantida aberta e o servidor pode enviar o conteúdo por push há muito tempo, usei, multipart/x-mixed-replacemas isso não funcionou no IE.

Eu acho que você pode fazer coisas inteligentes com pesquisas que o fazem funcionar mais como push, não enviando cabeçalhos inalterados, mas deixando a conexão aberta, mas eu nunca fiz isso.

faíscas
fonte
1

verifique esta biblioteca https://github.com/SignalR/SignalR para saber como enviar dados aos clientes dinamicamente à medida que estiverem disponíveis

arun peddakotla
fonte
0

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

Ryan Ahearn
fonte
0

Também pode querer ver o ReverseHTTP .

Evan
fonte