10.1.2017

foto Petr Bravenec

Petr Bravenec
Twitter: @BravenecPetr
+420 777 566 384
petr.bravenec@hobrasoft.cz

In the MDCV04IP server we very often use HTML5 event stream. velice často HTML5 proud událostí. Blíže se lze s proudem událostí seznámit v článku HTML5 proud událostí - v článku najdete stručný popis proudu události, živý příklad a odkaz na implementaci HTTP serveru pro C++ a Qt včetně zdrojových tvarů. V článku najdete i odkaz na Zdroják.cz se skvělým popisem HTML5 proudu událostí.

V našich aplikacích je klientem HTML5 proudu událostí vždy webový prohlížeč. Podpora pro proud událostí je dnes zabudovaná prakticky ve všech součaných prohlížečích kromě jednoho - u toho je však jistá dávka konzervativnosti tradiční a obvykle nikoho nepřekvapuje (mluvím o MSIE).

V systému MDCV04IP se objevila potřeba připojení k proudu událostí z klienta vytvořeného v C++ a Qt. S laskavým svolením firmy ZPT Vigantice můžete klienta HTML5 proudu událostí použít i ve své aplikaci.

You can find overview of http server here: Our work - Http Server for C++ and Qt

Třída Html5Stream

Třída Html5Stream je jednoduchý obal kolem QNetworkAccessManager. Objekt této třídy se připojí na požadovanou adresu a poslouchá příchozí data. Pokud se nějaká data objeví, vyvolá signál data(). Tímto signálem se mohou předávat data dvojího typu: jednak surová, nezpracovaná data (QString) a pak je na aplikačním programátorovi, aby si s daty poradil. Pokud však zdroj událostí posílá JSON, lze použít druhou modifikaci signálu data(). Ta předává rozparsovaná JSON data (QVariant).

Při ztrátě spojení by se měl klient připojit ke zdroji dat znovu automaticky. To je však jednoduše možné pouze u http metody get. Naštěstí je v praxi většina požadavků právě typu get. Pokud se použíje metoda post, může být pozdější rekonstrukce požadavku ve třídě nemožná. V takovém případě je možné využít přímo signálů vysílaných třídou QNetworkAccessManager a zrekonstruovat dotaz přímo v aplikaci.

Třída je vyrobená tak, aby fungovala jak v Qt4, tak v Qt5. Pro použití v Qt4 potřebuje přibalit knihovnu QJson.

Použití

Example::Example(QObject *parent) : QObject(parent) {
    Html5Stream *s = new Html5Stream(this);

    QUrl url = QUrl::fromUserInput("http://www.hobrasoft.cz:8080/example/events");
    QNetworkRequest request(url);
    connect(s,  SIGNAL(data(const QString&, const QVariant&)),
            this, SLOT(data(const QString&, const QVariant&)));
    s->get(request);
}

// Slot zpracovává přijatá JSON data a vypisuje je na konsolu
void Example::data(const QString& event, const QVariant& data) {
    qDebug() 
        < data.toMap()["id"].toString() 
        < data.toMap()["text"].toString() 
        < data.toMap()["counter"].toInt();
}

Download

Hotový příklad můžete stáhnout přímo odtud: html5stream.tgz

Licence: MIT.

Závěr

Proud událostí HTML5 je příjemný a jednoduchý způsob jednosměrné komunikace mezi http serverem a aplikací. Alternativou může být WebSocket, ten je však v Qt obsažený až od verze 5.

Hobrasoft s.r.o. | Contact