Enviando dados do servidor para o cliente sem uma solicitação do cliente?


11

Percebi enquanto navegava no Stack Exchange que existem notificações dinâmicas como "3 novas mensagens, clique para mostrar". Quero ter esse tipo de atualização dinâmica para o que estou prestes a explicar.

Digamos que eu queira criar um carrossel / apresentação de slides de 10 artigos de notícias recentes. Quero que esse carrossel seja atualizado a cada hora, em uma fila. Os artigos mais recentes empurrarão os artigos mais antigos para fora da fila. A solução em cima da minha cabeça seria.

  1. O usuário faz logon no cliente.
  2. O cliente calcula o número de minutos até a próxima hora e define um cronômetro para ser executado na hora.
  3. Na marca da hora, envie uma solicitação ao servidor sobre novos artigos de notícias que ainda não estejam no carrossel.
  4. Lidar com a resposta.
  5. Redefina o temporizador.

Essa é uma estratégia aceitável? Posso conseguir isso sem depender de solicitações de clientes? Em outras palavras, como o Stack Exchange consegue sua atualização dinâmica?


4
Dê uma olhada no SignalR.
Robert Harvey

Eu recomendo que você leia sobre RSS e AJAX para obter idéias. O RSS é um exemplo de protocolo padrão para feeds de assinatura e AJAX é um conceito de alto nível sobre como atualizar um cliente (navegador) sem recarregar a página. Aposto que é assim que o Stack Exchange funciona.


O cliente é um navegador, um cliente personalizado ou algo mais?
Outis

É um pouco hostil ao usuário, mas você pode fazer com que a página HTML se atualize a cada 15 minutos. A maioria das páginas da web de notícias faz isso.
Gilbert Le Blanc

Respostas:


7

Para enviar dados, você teria que identificar um cliente, e isso seria feito assinando o cliente no servidor. Feito isso, você terá uma lista de clientes inscritos com uma conexão persistente.

Dependendo do que você deseja alcançar, eu diria que é melhor o cliente solicitar ao servidor, para que você não precise manter uma conexão persistente e usar os protocolos de comunicação de solicitação / resposta como HTTP.

Um exemplo que vem à mente para manter uma conexão persistente seria um sistema de bate-papo ao vivo / mensagens instantâneas, pois a comunicação deve ocorrer em tempo real.

Lembre-se de que a conexão persistente geralmente é implementada através do uso de sockets, o que adiciona uma sobreposição na implementação de seu próprio protocolo de comunicação, criptografia, etc ...


2

Basicamente, você precisa enviar dados ao cliente e, como uma comunicação bidirecional não está no escopo do protocolo http, não é fácil implementá-lo por conta própria.

A solução do seu problema é socket.io

Como afirma o site,

"O Socket.IO permite comunicação bidirecional em tempo real, baseada em eventos. Ele funciona em todas as plataformas, navegadores ou dispositivos, com foco igualmente em confiabilidade e velocidade".

Espero que isso resolva seu problema.


7
Seria útil se você declarar se e como é afiliado ao socket.io e como ele ajudará a resolver o problema dos questionadores com base no seu conhecimento / experiência com a estrutura (em contraste com uma mera "declaração de missão" do site)
Benni

Os WebSockets são estritamente preferíveis ao Socket.IO agora que todos os principais navegadores implementam o padrão. A maioria dos idiomas principais possui implementações de websocket, mas não as de socket.io. O Socket.io adiciona estrutura adicional às mensagens, portanto também não é prontamente compatível.
Re: Alex Reinking

1

Não posso falar sobre como o SE faz isso, embora, como seja um site, existam várias maneiras de incluir um trabalho cron definido para executar um script php / asp / what-have-you na hora de enviar dados. Mas isso seria se você estivesse procurando uma solução apenas para a web.

Mas como você está mencionando um cliente, talvez seja possível criar um arquivo com a data / hora da atualização mais recente para esse cliente e fazer com que o cliente verifique o valor armazenado no arquivo e compare com o horário do sistema do usuário para ver se há uma hora já passou desde a última atualização. Se já tiver passado pelo menos uma hora, o cliente solicitará o fluxo de notícias mais recente do seu servidor, que retornará o fluxo de notícias mais recente ao cliente.

Eu evitaria usar um timer ou, pelo menos, usar um timer apenas, pois esse método funcionaria apenas se o usuário mantivesse o cliente aberto para manter o timer em funcionamento. Mas se você (também) tiver o arquivo como sugeri, poderá criar uma sub-rotina para abrir o arquivo, armazenar o tempo em uma variável e compará-lo com o horário do sistema e fazer a solicitação se já tiver passado pelo menos uma hora. Então você simplesmente faz chamadas para o sub em relação a determinados eventos. Definitivamente, eu chamaria isso de carregamento de formulário, porque se o usuário está apenas reiniciando o cliente, você deseja as últimas notícias. Se houvesse alguns dias desde que eles estavam no cliente, isso mostraria notícias antigas. No mínimo, amarre esse sub ao carregamento do cliente e inicie o cronômetro, conforme sugerido.

Peço desculpas se não entendi o que você estava procurando, pois não tenho muita certeza do que você está procurando. Mas espero que de qualquer maneira haja algo de valor aqui para você!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.