Qt Networking avanzato

1,005 views
925 views

Published on

Approfondisci la conoscenza delle nuove classi di Qt dedicate al networking

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,005
On SlideShare
0
From Embeds
0
Number of Embeds
12
Actions
Shares
0
Downloads
15
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • facciamo notare l'interfaccia url based per caricare una risorsa http e la deleteLater nella rFinished
  • facciamo notare un paio di cose: ovviamente l'utilizzo del segnale sul manager ci permette di non avere la QNetworkReply tra I membri della classe la QNetworkRequest nonostante abbia il supporto per la manipolazione degli header non richiede la gestione esplicita di quegli “ovvi” (tipo Host richiesto dall'Http 1.1). È un'interfaccia di alto livello
  • il default per il CacheLoadControlAttribute è PreferNetwork
  • con proxy http si intende la possibilità di usare la CONNECT per fare tunneling, mentre con HTTP Caching si intende un proxy che gira le richieste http.
  • Qt Networking avanzato

    1. 1. #include <QtNetwork> David Mugnai dvd@develer.com
    2. 2. QtNetworkmodulo Qt per realizzare programmi di rete non dipende da QtGuifornisce classi di alto livello client http/ftpfornisce classi di basso livello accesso diretto al socket event driven (= high performance)supporto SSL
    3. 3. QtNetwork alto livello basso livelloQNetworkAccessManager QTcpServerQFtp QTcpSocket QUdpServer QUdpSocket QSsl*
    4. 4. QNetworkAccessManagermodellato ispirandosi allHTTP un metodo per ogni verbo httpQNetworkRequest pieno supporto per la gestione degli header httpQNetworkReply accesso agli header della risposta segnali per seguire il download è un QIODevice
    5. 5. QNetworkAccessManagerQNetworkRequest pieno supporto per la gestione degli header httpQNetworkReply accesso agli header della risposta segnali per seguire il download è un QIODevice
    6. 6. QNetworkAccessManagerclass NetworkDemo : public QObject{Q_OBJECTpublic:    explicit NetworkDemo(QObject *parent = 0) :        QObject(parent), manager(this)    {        reply = manager.get(QNetworkRequest(QUrl("http://www.develer.com/")));        QObject::connect(reply, SIGNAL(finished()), this, SLOT(rFinished()));    }public slots:    void rFinished() {        qDebug() << reply->url() << reply->readAll().length();        reply->deleteLater();    }private:    QNetworkAccessManager manager;    QNetworkReply *reply;};
    7. 7. QNetworkAccessManageraccesso alla rete event driven levent loop deve essere in esecuzioneil lifetime di un QNetworkReply è responsabilità del programmatore non distruggere la reply durante il segnale finished() usare invece il deleteLaterQNetworkAccessManager ripropone il segnale finished() della reply
    8. 8. QNetworkAccessManagerexplicit NetworkDemo(QObject *parent = 0) :    QObject(parent), manager(this){  manager.get(QNetworkRequest(QUrl("http://www.develer.com/")));  QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(rFinished(QNetworkReply*)));}void rFinished(QNetworkReply *r) {  qDebug() << r->url() << r->readAll().length();  r->deleteLater();}
    9. 9. Il QNetworkReply è un QIODevicepublic slots:    void rFinished(QNetworkReply *r) {        image.load(r, "GIF");        label.setPixmap(QPixmap::fromImage(image));        label.show();        r­>deleteLater();    }la risposta è un QIODevice ad accesso sequenziale una volta letti i dati sono persiil segnale readyRead() viene emesso quando
    10. 10. QNetworkRequestusare la POST è un po più complicatosfortunatamente non esiste un meccanismo di alto livello per specificare lencodingil default è application/x-www-form-urlencoded che va bene ma ricordatevi di fare lescape degli argomenti, QUrl::toPercentEncoding QByteArray ba("field=foo&test=1&test=2" ); manager.post(QNetworkRequest (url), ba);
    11. 11. QNetworkRequestper lupload di un file dovete codificare il body usando lencoding multipart/form-data nessun aiuto :(dovete preparare manualmente il body http://www.w3.org/TR/html401/interact/forms.html#h-17.3.4.2 non scordatevi gli header nella richiesta request.setHeader(QNetworkRequest::ContentTypeHe ader, “...”)
    12. 12. QNetworkRequest Gli header aggiunti di default in una richiesta POSTPOST /x/ HTTP/1.1 Content­Length: 23 Connection: Keep­Alive Accept­Encoding: gzip Accept­Language: en­US,* User­Agent: Mozilla/5.0 Host: localhost:8000 Content­Type: application/x­www­form­urlencoded field=foo&test=1&test=2
    13. 13. bells and whistlessupporto per le risorse httpscache localecookie jarnetwork proxy
    14. 14. httpsQUrl url("https://www.develer.com/website/en");manager.get(QNetworkRequest(url));
    15. 15. cache localeQNetworkDiskCache semplice cache disk based la directory utilizzata non può essere condivisa tra cache tra i vari settaggi il limite sulla dimensioneper utilizzi più avanzati QAbstractNetworkCache
    16. 16. cache locale QNetworkAccessManager  *manager = new QNetworkAccessManager (this); QNetworkDiskCache  *diskCache  = new QNetworkDiskCache (this); diskCache ­>setCacheDirectory ("cacheDir" ); manager­>setCache (diskCache );utilizzando lattributo della request CacheLoadControlAttribute si può controllare il meccanismo di cachelattributo SourceIsFromCacheAttribute per controllare la provenienza della risposta
    17. 17. QNetworkCookieJarcookie storage non permanentenessuna policy di accettazione si accettano tutti i cookiepolicy di sicurezza base same originper cambiare il comportamento subclass
    18. 18. QNetworkProxyinstrada le connessioni attraverso un proxy SOCK5, HTTP, HTTP Caching, FTP Cachingtransparente rispetto al restante codice di rete application wide / per socketanonymous, username/password
    19. 19. QNetworkProxyQNetworkProxy proxy;proxy.setType(QNetworkProxy::Socks5Proxy);proxy.setHostName("proxy.example.com");proxy.setPort(1080);proxy.setUser("username");proxy.setPassword("password");QNetworkProxy::setApplicationProxy(proxy);
    20. 20. low level networkingHTTPServer::HTTPServer(QObject *parent) :    QObject(parent), server(this){    server.listen(QHostAddress::Any, 8080);    QObject::connect(&server, SIGNAL(newConnection()), this, SLOT(newConnection()));}void HTTPServer::newConnection() {    QTcpSocket *socket = server.nextPendingConnection();    QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(onDataReady()));    QObject::connect(socket, SIGNAL(disconnected()), this,SLOT(onSocketDisconnected()));}void HTTPServer::onDataReady() {    QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());    if(socket) {        socket->write("HTTP/1.1 200 OKrnrnhello world");        socket->disconnectFromHost();    }}void HTTPServer::onSocketDisconnected() {    QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());    if(socket)        socket->deleteLater();}
    21. 21. low level networkingsupporto di rete high 9000 8000 end 8000 7000alta scalabilità 7000 6000nessuna magia 6000 5000 5000code cross platform 4000 4000 reply/s errors RSS 3000 3000 2000 2000 1000 1000 0 0 1000 2000 3000 4000 4500 5000 5500 6000 6500 7000 7500 8000
    22. 22. QtNetworkingdvd@develer.com

    ×