Utilizando Comet para simular WebSockets

Uma das funcionalidades do HTML 5 mais aguardadas por mim são os WebSockets [1]. O WebSocket, para quem não conhece, é uma tecnologia que permite a comunicação espontânea da aplicação no sentido servidor cliente (browser), isto é: o servidor pode enviar dados para o cliente a qualquer tempo, sem a necessidade do cliente (browser) ficar fazendo qualquer tipo de polling via ajax ou algo parecido.

Infelizmente a especificação desta funcionalidade pelo W3C não ficará pronta para o release do IE 9, e, portanto, o IE 9 não suportará esta funcionalidade. Como o IE, em todas as suas versões, possui mais de 50% do market share, fica difícil utilizar uma tecnologia a qual menos da metade das pessoas poderá usufruir. Imaginem, por exemplo, que o chat do Gtalk no Gmail suportasse apenas alguns browsers. Todo o motivo de existência da funcionalidade (integrar todo mundo) simplesmente deixaria de existir.

Enquanto os WebSockets não são suportados por todos os browsers mais novos, apareceu na internet uma técnica conhecida como Comet [2], e utilizada por sites de peso, como o próprio exemplo do Gtalk embutido no Gmail, no Orkut, etc.

Esta técnica é uma das mais criativas que eu já vi, e consiste, normalmente, em utilizar um elemento IFRAME na sua página que aponta para uma página que nunca termina de carregar. Esta página está sempre aguardando mensagens do servidor e, no momento em que o servidor quiser se comunicar com o cliente (browser), ela imprime no seu corpo (Response.Write) um bloco javascript e chama o método Response.Flush(), que faz com que o conteúdo seja enviado para o cliente mas que a execução da página não seja finalizada. Basicamente trata-se de um while() onde Response.End() nunca é chamado. Isto permite que o servidor envie, a qualquer momento, dados para o cliente se atualizar, o que é o objetivo principal do WebSocket.

Os detalhes do funcionamento do Comet variam, e podem ser flexibilizados para melhor atender às necessidades de cada aplicação. Combinar esta técnica com os Data URIs, comentados no meu post anterior, podem produzir um efeito de streaming de vídeo via HTTP muito prático, leve e interessante.

[1] http://pt.wikipedia.org/wiki/WebSockets
[2] http://en.wikipedia.org/wiki/Comet_(programming)

Leave a comment