Server-Sent Events avec C++Builder

Les Server-Sent Events (SSE) servent à pousser des informations à partir d’un serveur HTTP vers un navigateur web. Habituellement c’est le client qui doit demander l’information au serveur, mais avec cette méthode c’est le contraire.

Le principe est simple: le client fait une requête à une adresse web dans le but de recevoir des évènements DOM. Pour effectuer cela, c’est EventSource de l’API JavaScript qui sera utilisé. Il est important de dire que les Server-Sent Events ne sont pas encore supportés dans Internet Explorer.

La première étape est de créer un nouveau projet C++Builder. Dans la Form il faut insérer un TIdHTTPServer. C’est ce contrôle de Indy qui sera utilisé pour le serveur. On commence d’abord par démarrer le serveur avec ligne de code dans le constructeur:

    IdHTTPServer1->Active = true;

Dans l’évènement OnCommandGet du TIdHTTPServer on ajoute ce code:

    if(ARequestInfo->URI == "/demo")
    {
        TIdTCPConnection* Connection = AContext->Connection;
        while(Connection->Connected())
        {
            System::Word Hour, Min, Sec, MSec;
            Now().DecodeTime(&Hour, &Min, &Sec, &MSec);
            String Message = "Voici l'heure sur le serveur: " +
                Format("%.2d:%.2d:%.2d.%.3d", ARRAYOFCONST((Hour, Min, Sec, MSec)));

            Connection->IOHandler->WriteBufferOpen();
            Connection->IOHandler->WriteLn("HTTP/1.1 200 OK");
            Connection->IOHandler->WriteLn("Content-Type: text/event-stream; charset=UTF-8");
            Connection->IOHandler->WriteLn("Cache-Control: no-cache");
            Connection->IOHandler->Write("data: " + Message + "\n\n");
            Connection->IOHandler->WriteBufferClose();

            Sleep(100); // Une petite pause
        }
    }
    else
    {
        AResponseInfo->ContentText =
            "<!doctype html>"
            "<html>"
            "    <head>"
            "        <title>Server-Sent Events</title>"
            "        <script type = \"text/javascript\">"
            ""
            "        var source = new EventSource(\"demo\");"
            "        source.onmessage = function(event)"
            "        {"
            "            document.getElementById(\"result\").innerHTML = event.data;"
            "        };"
            ""
            "        </script>"
            "    </head>"
            "    <body>"
            "        <p id=\"result\"></p>"
            "    </body>"
            "</html>";
    }

Voilà, maintenant il suffit d’ouvrir votre navigateur web à l’adresse 127.0.0.1 vous devriez voir l’heure de votre PC qui s’actualise à tous les 100ms.

Une réponse à “Server-Sent Events avec C++Builder”

  1. Super Tuto… Ça a pu m’inspirer pour régler un problème côté Server dont je ne soupçonnais pas du tout l’existence…Et tout ceci, en utilisant le côté « Client » (Le html) de ce tuto, simplement pour tester mon côté serveur.

    Merci pour l’inspiration 🙂

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*