Aplicativos web em C++ usando o Tufão
Quando eu comento sobre desenvolvimento web em C++ a alguns programadores, eles demonstram uma falta de fé perceptível na ideia, enquanto outros ficam curiosos e começam a discutir como as peculiaridades da linguagem afetam o seu uso na área. Inspirado pela framework Node.js, desenvolvi o Tufão.
Parte 4: WebSocket
Uma limitação do protocolo HTTP, já exposta anteriormente, é que não é possível enviar informações ao cliente, inviabilizando um sistema de notificação de eventos. Para contornar tal limitação, existem várias técnicas, detalhadas na Wikipédia. Cada uma dessas técnicas possuem, por não ser algo natural para o qual o protocolo foi projeto, limitações.
A solução definitiva para o problema foi batizada de WebSocket e é composta de duas partes, um protocolo e uma API JavaScript. O protocolo foi finalizado em dezembro do ano passado e já é suportado pelo Tufão desde a versão 0.2. A API ainda está sendo padronizada.
O HTTP permite que uma conexão seja atualizada para outro protocolo e é essa característica que o WebSocket usa para funcionar, fornecendo um canal de comunicação bidirecional.
Para usar WebSockets no Tufão, você precisa criar uma classe que herde de HttpServer e sobrescrever o método upgrade. O código abaixo mostra como fazê-lo:
Para usar esse protocolo nas suas páginas web, você precisará também da API JavaScript. Uma boa referência para o mesmo pode ser encontrada no site da Mozilla. É importante lembrar que a API está em desenvolvimento e pode mudar até o lançamento de sua versão final.
A solução definitiva para o problema foi batizada de WebSocket e é composta de duas partes, um protocolo e uma API JavaScript. O protocolo foi finalizado em dezembro do ano passado e já é suportado pelo Tufão desde a versão 0.2. A API ainda está sendo padronizada.
O HTTP permite que uma conexão seja atualizada para outro protocolo e é essa característica que o WebSocket usa para funcionar, fornecendo um canal de comunicação bidirecional.
Para usar WebSockets no Tufão, você precisa criar uma classe que herde de HttpServer e sobrescrever o método upgrade. O código abaixo mostra como fazê-lo:
void WebServer::upgrade(Tufao::HttpServerRequest *request,
const QByteArray &head)
{
Tufao::WebSocket *socket = new Tufao::WebSocket(this);
socket->startServerHandshake(request, head);
socket->setMessagesType(Tufao::WebSocket::TEXT_MESSAGE);
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
connect(socket, SIGNAL(newMessage(QByteArray)),
/* ... */, /* ... */);
}
const QByteArray &head)
{
Tufao::WebSocket *socket = new Tufao::WebSocket(this);
socket->startServerHandshake(request, head);
socket->setMessagesType(Tufao::WebSocket::TEXT_MESSAGE);
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
connect(socket, SIGNAL(newMessage(QByteArray)),
/* ... */, /* ... */);
}
Para usar esse protocolo nas suas páginas web, você precisará também da API JavaScript. Uma boa referência para o mesmo pode ser encontrada no site da Mozilla. É importante lembrar que a API está em desenvolvimento e pode mudar até o lançamento de sua versão final.
Você podia aproveitar a infraestrutura de outro servidor web ao invés de fazer tudo do zero, por exemplo o apache, modificar o processo de construção para construir um módulo do apache ao invés de um servidor standalone. Talvez um protocolo mais agnóstico como FastCGI seja ainda melhor.
De qualquer maneira, muito legal!