SlideShare ist ein Scribd-Unternehmen logo
1 von 22
#include <QtNetwork>




    David Mugnai
  dvd@develer.com
QtNetwork

modulo Qt per realizzare programmi di rete
  non dipende da QtGui
fornisce classi di alto livello
  client http/ftp
fornisce classi di basso livello
  accesso diretto al socket
  event driven (= high performance)
supporto SSL
QtNetwork

       alto livello                basso livello
QNetworkAccessManager      QTcpServer
QFtp                       QTcpSocket
                           QUdpServer
                           QUdpSocket
                           QSsl*
QNetworkAccessManager

modellato ispirandosi all'HTTP
  un metodo per ogni verbo http
QNetworkRequest
  pieno supporto per la gestione degli header http
QNetworkReply
  accesso agli header della risposta
  segnali per seguire il download
  è un QIODevice
QNetworkAccessManager

QNetworkRequest
 pieno supporto per la gestione degli header http
QNetworkReply
 accesso agli header della risposta
 segnali per seguire il download
 è un QIODevice
QNetworkAccessManager
class NetworkDemo : public QObject
{
Q_OBJECT
public:
    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;
};
QNetworkAccessManager

accesso alla rete event driven
  l'event loop deve essere in esecuzione
il lifetime di un QNetworkReply è responsabilità
   del programmatore
  non distruggere la reply durante il segnale finished()
  usare invece il deleteLater
QNetworkAccessManager ripropone il segnale
 finished() della reply
QNetworkAccessManager
explicit 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();
}
Il QNetworkReply è un QIODevice
public 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 persi
il segnale readyRead() viene emesso quando
QNetworkRequest

usare la POST è un po' più complicato
sfortunatamente non esiste un meccanismo di
  alto livello per specificare l'encoding
il default è application/x-www-form-urlencoded
  che va bene ma ricordatevi di fare l'escape degli
    argomenti, QUrl::toPercentEncoding
  QByteArray ba("field=foo&test=1&test=2" );
  manager.post(QNetworkRequest (url), ba);
QNetworkRequest

per l'upload di un file dovete codificare il body
 usando l'encoding 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, “...”)
QNetworkRequest

   Gli header aggiunti di default in una richiesta POST

POST /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
bells and whistles

supporto per le risorse https
cache locale
cookie jar
network proxy
https

QUrl url("https://www.develer.com/website/en");
manager.get(QNetworkRequest(url));
cache locale

QNetworkDiskCache
  semplice cache disk based
  la directory utilizzata non può essere condivisa tra
    cache
  tra i vari settaggi il limite sulla dimensione
per utilizzi più avanzati
  QAbstractNetworkCache
cache locale
 QNetworkAccessManager  *manager = new QNetworkAccessManager (this);
 QNetworkDiskCache  *diskCache  = new QNetworkDiskCache (this);
 diskCache ­>setCacheDirectory ("cacheDir" );
 manager­>setCache (diskCache );

utilizzando l'attributo della request
  CacheLoadControlAttribute si può controllare il
  meccanismo di cache
l'attributo SourceIsFromCacheAttribute per
   controllare la provenienza della risposta
QNetworkCookieJar

cookie storage non permanente
nessuna policy di accettazione
  si accettano tutti i cookie
policy di sicurezza base
  same origin
per cambiare il comportamento
  subclass
QNetworkProxy

instrada le connessioni attraverso un proxy
  SOCK5, HTTP, HTTP Caching, FTP Caching
transparente rispetto al restante codice di rete
  application wide / per socket
anonymous, username/password
QNetworkProxy
QNetworkProxy proxy;
proxy.setType(QNetworkProxy::Socks5Proxy);
proxy.setHostName("proxy.example.com");
proxy.setPort(1080);
proxy.setUser("username");
proxy.setPassword("password");
QNetworkProxy::setApplicationProxy(proxy);
low level networking
HTTPServer::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();
}
low level networking

supporto di rete high     9000                                                                 8000



  end                     8000
                                                                                               7000




alta scalabilità          7000
                                                                                               6000




nessuna magia
                          6000
                                                                                               5000


                          5000



code 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
QtNetworking




dvd@develer.com

Weitere ähnliche Inhalte

Ähnlich wie Qt Networking avanzato

How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript Stefano Marchisio
 
Progettazione e sviluppo di applicazioni web 2.0 con PHP e Ajax
Progettazione e sviluppo di applicazioni web 2.0 con PHP e AjaxProgettazione e sviluppo di applicazioni web 2.0 con PHP e Ajax
Progettazione e sviluppo di applicazioni web 2.0 con PHP e AjaxGiovanni Cappellini
 
Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010Fabrizio Bernabei
 
SMAU 2008: "Vulnerabilità in Tomcat: l'evoluzione della specie"
SMAU 2008: "Vulnerabilità in Tomcat: l'evoluzione della specie"SMAU 2008: "Vulnerabilità in Tomcat: l'evoluzione della specie"
SMAU 2008: "Vulnerabilità in Tomcat: l'evoluzione della specie"guest2c6b3
 
WebRTC prove pratiche, esperimenti e curiosità
WebRTC prove pratiche, esperimenti e curiositàWebRTC prove pratiche, esperimenti e curiosità
WebRTC prove pratiche, esperimenti e curiositàComparto Web
 
Lezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSLLezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSLAndrea Della Corte
 
Sviluppo di servizi REST per Android - Luca Masini
Sviluppo di servizi REST per Android - Luca Masini Sviluppo di servizi REST per Android - Luca Masini
Sviluppo di servizi REST per Android - Luca Masini Whymca
 
SVILUPPO DI SERVIZI REST PER ANDROID
SVILUPPO DI SERVIZI REST PER ANDROIDSVILUPPO DI SERVIZI REST PER ANDROID
SVILUPPO DI SERVIZI REST PER ANDROIDLuca Masini
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con ScalaFranco Lombardo
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerMatteo Magni
 
Corso WebApp iOS - Lezione 06: Web Development for iOS Devices
Corso WebApp iOS - Lezione 06:   Web Development for iOS DevicesCorso WebApp iOS - Lezione 06:   Web Development for iOS Devices
Corso WebApp iOS - Lezione 06: Web Development for iOS DevicesAndrea Picchi
 
Antica presentazione AJAX
Antica presentazione AJAXAntica presentazione AJAX
Antica presentazione AJAXTommaso Torti
 
Angular: Servizi e DI
Angular:  Servizi e DIAngular:  Servizi e DI
Angular: Servizi e DIValerio Como
 
SIGNALR TO-THE-MAX: VERSO IL WEB ED OLTRE!
SIGNALR TO-THE-MAX: VERSO IL WEB ED OLTRE!SIGNALR TO-THE-MAX: VERSO IL WEB ED OLTRE!
SIGNALR TO-THE-MAX: VERSO IL WEB ED OLTRE!DotNetCampus
 
Signal r to the-max
Signal r to the-maxSignal r to the-max
Signal r to the-maxDotNetCampus
 
Del furia signalr-to-the-max
Del furia   signalr-to-the-maxDel furia   signalr-to-the-max
Del furia signalr-to-the-maxDotNetCampus
 

Ähnlich wie Qt Networking avanzato (20)

How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript
 
Progettazione e sviluppo di applicazioni web 2.0 con PHP e Ajax
Progettazione e sviluppo di applicazioni web 2.0 con PHP e AjaxProgettazione e sviluppo di applicazioni web 2.0 con PHP e Ajax
Progettazione e sviluppo di applicazioni web 2.0 con PHP e Ajax
 
Yagwto
YagwtoYagwto
Yagwto
 
Php mysql3
Php mysql3Php mysql3
Php mysql3
 
Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010
 
SMAU 2008: "Vulnerabilità in Tomcat: l'evoluzione della specie"
SMAU 2008: "Vulnerabilità in Tomcat: l'evoluzione della specie"SMAU 2008: "Vulnerabilità in Tomcat: l'evoluzione della specie"
SMAU 2008: "Vulnerabilità in Tomcat: l'evoluzione della specie"
 
WebRTC prove pratiche, esperimenti e curiosità
WebRTC prove pratiche, esperimenti e curiositàWebRTC prove pratiche, esperimenti e curiosità
WebRTC prove pratiche, esperimenti e curiosità
 
Lezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSLLezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSL
 
Sviluppo di servizi REST per Android - Luca Masini
Sviluppo di servizi REST per Android - Luca Masini Sviluppo di servizi REST per Android - Luca Masini
Sviluppo di servizi REST per Android - Luca Masini
 
SVILUPPO DI SERVIZI REST PER ANDROID
SVILUPPO DI SERVIZI REST PER ANDROIDSVILUPPO DI SERVIZI REST PER ANDROID
SVILUPPO DI SERVIZI REST PER ANDROID
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con Scala
 
Novità di Asp.Net 4.0
Novità di Asp.Net 4.0Novità di Asp.Net 4.0
Novità di Asp.Net 4.0
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
 
Corso WebApp iOS - Lezione 06: Web Development for iOS Devices
Corso WebApp iOS - Lezione 06:   Web Development for iOS DevicesCorso WebApp iOS - Lezione 06:   Web Development for iOS Devices
Corso WebApp iOS - Lezione 06: Web Development for iOS Devices
 
Antica presentazione AJAX
Antica presentazione AJAXAntica presentazione AJAX
Antica presentazione AJAX
 
Angular: Servizi e DI
Angular:  Servizi e DIAngular:  Servizi e DI
Angular: Servizi e DI
 
HTML5
HTML5HTML5
HTML5
 
SIGNALR TO-THE-MAX: VERSO IL WEB ED OLTRE!
SIGNALR TO-THE-MAX: VERSO IL WEB ED OLTRE!SIGNALR TO-THE-MAX: VERSO IL WEB ED OLTRE!
SIGNALR TO-THE-MAX: VERSO IL WEB ED OLTRE!
 
Signal r to the-max
Signal r to the-maxSignal r to the-max
Signal r to the-max
 
Del furia signalr-to-the-max
Del furia   signalr-to-the-maxDel furia   signalr-to-the-max
Del furia signalr-to-the-max
 

Qt Networking avanzato

Hinweis der Redaktion

  1. facciamo notare l&apos;interfaccia url based per caricare una risorsa http e la deleteLater nella rFinished
  2. facciamo notare un paio di cose: ovviamente l&apos;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&apos;Http 1.1). È un&apos;interfaccia di alto livello
  3. il default per il CacheLoadControlAttribute è PreferNetwork
  4. 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.