Tłumaczenie i adaptacja materiałów: dr Tomasz Xięski. Na podstawie prezentacji udostępnionych przez Digia Plc. na licencji CC.

Podobne dokumenty
Qt in Education. Sieć I drukowanie

Tłumaczenie i adaptacja materiałów: dr Tomasz Xięski. Na podstawie prezentacji udostępnionych przez Digia Plc. na licencji CC.

The Graphics View Framework. Oprogramowanie i wykorzystanie stacji roboczych. Wykład 5. he Graphics View Framework - architektura

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 4

Architektury systemów rozproszonych LABORATORIUM. Ćwiczenie 1

Implementacja aplikacji sieciowych z wykorzystaniem środowiska Qt

13. Konfiguracja proxy http, smtp, pop3, ftp, ssl

MODEL WARSTWOWY PROTOKOŁY TCP/IP

Sieci komputerowe. Wykład 5: Warstwa transportowa: TCP i UDP. Marcin Bieńkowski. Instytut Informatyki Uniwersytet Wrocławski

Platformy Programistyczne Zagadnienia sieciowe i wątki

Przygotowanie do nowoczesnego programowania po stronie przeglądarki. (HTML5, CSS3, JS, wzorce, architektura, narzędzia)

Tworzenie stron internetowych z wykorzystaniem HTM5, JavaScript, CSS3 i jquery. Łukasz Bartczuk

4. Podstawowa konfiguracja

Wybrane działy Informatyki Stosowanej

TCP/IP. Warstwa aplikacji. mgr inż. Krzysztof Szałajko

Programowanie współbieżne i rozproszone

Programowanie Sieciowe 1

Instrukcja konfiguracji funkcji skanowania

REACT NATIVE. Anna Maziejuk Kamil Jankowski

Programowanie w środowiskach RAD Qt i C++

ARP Address Resolution Protocol (RFC 826)

Wykład 3 / Wykład 4. Na podstawie CCNA Exploration Moduł 3 streszczenie Dr inż. Robert Banasiak

Wywoływanie metod zdalnych

Jarosław Kuchta Administrowanie Systemami Komputerowymi. Internetowe Usługi Informacyjne

Podstawy programowania w języku JavaScript

Front-end: solidne podstawy. Wszystko, co warto wiedzieć o HTML, CSS, JavaScript i Bootstrap.

Czym jest AJAX. AJAX wprowadzenie. Obiekt XMLHttpRequest (XHR) Niezbędne narzędzia. Standardowy XHR. XHR z obsługą baz danych

Protokół HTTP. 1. Protokół HTTP, usługi www, model request-response (żądanie-odpowiedź), przekazywanie argumentów, AJAX.

Forum Client - Spring in Swing

Stos TCP/IP. Warstwa aplikacji cz.2

Programowanie w Internecie

PHP: bazy danych, SQL, AJAX i JSON

Qt sygnały i designer

Studium przypadku Case Study CCNA2-ROUTING. Warianty projektów

Wywoływanie metod zdalnych

OpenLaszlo. OpenLaszlo

Tworzenie i wykorzystanie usług sieciowych

Programowanie w Sieci Internet JSP ciąg dalszy. Kraków, 9 stycznia 2015 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

1. W protokole http w ogólnym przypadku elementy odpowiedzi mają: a) Postać tekstu b) Postać HTML c) Zarówno a i b 2. W usłudze DNS odpowiedź

Wprowadzenie. 1. Terminal WebRTC. LABORATORIUM 5: WebRTC komunikacja między terminalami.

Zrąb JavascriptMVC. Krzysztof Płocharz. 6 kwiecień Uniwersytet Warszawski

Technologie cyfrowe. Artur Kalinowski. Zakład Cząstek i Oddziaływań Fundamentalnych Pasteura 5, pokój 4.15 Artur.Kalinowski@fuw.edu.

Programowanie w środowiskach RAD QtCreator, Qt i C++

Tunelowanie, kapsułkowanie, XDR. 1. Transmisja tunelowa i kapsułkowanie serwery proxy. 2. Zewnętrzna reprezentacja danych XDR.

Sieci komputerowe. Zajęcia 3 c.d. Warstwa transportu, protokoły UDP, ICMP

Angular, cz. II. Tworzenie serwisów Web 2.0. dr inż. Robert Perliński

11. Autoryzacja użytkowników

Serwery Statefull i Stateless

TOPIT Załącznik nr 3 Programowanie aplikacji internetowych

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Aplikacje RMI

Źródła. cript/1.5/reference/ Ruby on Rails: AJAX: ssays/archives/

Wykład 5: Najważniejsze usługi sieciowe: DNS, SSH, HTTP, . A. Kisiel,Protokoły DNS, SSH, HTTP,

Sprawozdanie Sieci komputerowe i bazy danych Laboratorium nr 4

Moduł Ethernetowy. instrukcja obsługi. Spis treści

ECDL/ICDL Web Editing Moduł S6 Sylabus - wersja 2.0

Zajęcia 4 - Wprowadzenie do Javascript

Sieci komputerowe. Wykład 8: Warstwa zastosowań: FTP i HTTP. Marcin Bieńkowski. Instytut Informatyki Uniwersytet Wrocławski

Podstawowe typy serwerów

JĘZYK PYTHON - NARZĘDZIE DLA KAŻDEGO NAUKOWCA. Marcin Lewandowski [ mlew@ippt.gov.pl ]

Przesyłania danych przez protokół TCP/IP

ASP.NET MVC. Grzegorz Caban 20 stycznia 2009

Systemy internetowe. Wykład 5 Architektura WWW. West Pomeranian University of Technology, Szczecin; Faculty of Computer Science

TRX API opis funkcji interfejsu

Aplikacje WWW Wprowadzenie

Zestaw ten opiera się na pakietach co oznacza, że dane podczas wysyłania są dzielone na niewielkie porcje. Wojciech Śleziak

Zagrożenia trywialne. Zagrożenia bezpieczeństwa aplikacji internetowych. Parametry ukryte. Modyfikowanie parametrów wywołania

Politechnika Łódzka. Instytut Systemów Inżynierii Elektrycznej

Wybrane działy Informatyki Stosowanej

Laboratorium - Używanie programu Wireshark do obserwacji mechanizmu uzgodnienia trójetapowego TCP

Zaawansowane aplikacje internetowe - laboratorium

I.Wojnicki, Tech.Inter.

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Qt sygnały i sloty. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydział Elektroniki Politechnika Wrocławska

Laboratorium 7 Blog: dodawanie i edycja wpisów

Dr Michał Tanaś(

SIP Studia Podyplomowe Ćwiczenie laboratoryjne Instrukcja

Klient-Serwer Komunikacja przy pomocy gniazd

Programowanie Multimediów. Programowanie Multimediów JAVA. wprowadzenie do programowania (3/3) [1]

Podejście obiektowe do budowy systemów rozproszonych

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

SIECI KOMPUTEROWE I TECHNOLOGIE INTERNETOWE

Tworzenie witryn internetowych PHP/Java. (mgr inż. Marek Downar)

Kontrola sesji w PHP HTTP jest protokołem bezstanowym (ang. stateless) nie utrzymuje stanu między dwoma transakcjami. Kontrola sesji służy do

Ćwiczenie 2. Obsługa gniazd w C#. Budowa aplikacji typu klient-serwer z wykorzystaniem UDP.

Widżety KIWIPortal. tworzenie umieszczanie na stronach internetowych opcje zaawansowane. Autor: Damian Rebuś Data: Wersja: 1.

Programowanie w Internecie. Podstawy użycia JSP. Paweł Kasprowski. vl06z

Sieci komputerowe. Wykład 7: Transport: protokół TCP. Marcin Bieńkowski. Instytut Informatyki Uniwersytet Wrocławski

Efektywne tworzenie aplikacji webowych z wykorzystaniem AngularJS, HTML5 i JavaScript

Java Server Faces narzędzie do implementacji w wy prezentacji

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Wybrane działy Informatyki Stosowanej

Typy przetwarzania. Przetwarzanie zcentralizowane. Przetwarzanie rozproszone

Spis treści CZĘŚĆ I JĘZYK SIECI 17. Wstęp 13. Rozdział 1 Wprowadzenie do HTML5 19. Rozdział 2 Znajomość znaczników HTML5 37

Na podstawie: Kirch O., Dawson T. 2000: LINUX podręcznik administratora sieci. Wydawnictwo RM, Warszawa. FILTROWANIE IP

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Transkrypt:

Wykorzystanie sieci

Tłumaczenie i adaptacja materiałów: dr Tomasz Xięski. Na podstawie prezentacji udostępnionych przez Digia Plc. na licencji CC. 2012 Digia Plc. The enclosed Qt Materials are provided under the Creative Commons Attribution-Share Alike 2.5 License Agreement. The full license text is available here: http://creativecommons.org/licenses/by-sa/2.5/legalcode. Digia, Qt and the Digia and Qt logos are the registered trademarks of Digia Plc. in Finland and other countries worldwide.

Moduł QtWebKit dostarcza silnik renderowania stron internetowych, parsowania JavaScript i inne QNetworkAccessManager zapewnia interfejs do wysyłania i otrzymywania zapytań sieciowych QFtp implementuje klienta FTP QTcpSocket i QTcpServer zapewniają dostęp do gniazd TCP QSslSocket jak wyżej, ale połączenie jest szyfrowane QUdpSocket zapewnia dostęp do gniazd UDP

Bazuje na otwarto-źródłowej implementacji silnika WebKit WebKit stanowi bazę dla przeglądarki Safari oraz wielu innych Apple na początku bazowało na silniku KHTML oraz KJS napisanych dla KDE KDE również wykorzystuje framework Qt QtWebKit pozwala na tworzenie aplikacji hybrydowych

HTML 4.01 i spora część HTML 5 Dwuwymiarowy canvas Odtwarzanie audio i video Aplikacje offline Web workers i HTML storage CSS 1+2 oraz w większości CSS 3 Tło i obramowania Czcionki Dwu i trójwymiarowe transformacje Tranzycje i animacje

QWebView QWebPage QWebFrame

QWebView *view = new QWebView(); view->load(qurl("http://qt.io"));

Integracja aplikacji ze stroną internetową daje wiele wymiernych korzyści Integracja oznacza: Dołączanie dynamicznych treści do stron internetowych Dostęp do WWW i JavaScript przez Qt Dostęp do Qt z poziomu JavaScript

Możliwe jest dołączanie widżetów Qt do stron internetowych w formie wtyczek Jeżeli strona internetowa posiada znacznik object tag, Qt poszukuje właściwości mime-type Właściwość mime-type jest używana by odpytać o pasującą instancję klasy QWebPluginFactory Jeżeli występuje zgodność, fabryka tworzy odpowiedni widżet

Dołączanie komponentów do strony internetowej zostanie zaprezentowane na przykładzie QCalendarWidget. Zostaną pokazane: Kod HTML Instancja QWebPluginFactory Zarządzanie właściwościami Włączanie wtyczek w silniku webkit

Od strony HTML wystarczy odpowiednio zdefiniować znacznik object <html> <body> <h1>integrated Widget</h1> <p> <object type="application/x-qt-calendar"> <param name="gridvisible" value="true" /> </object> <object type="application/x-qt-calendar"> <param name="gridvisible" value="false" /> </object> </p> </html>

Zadaniem obiektu klasy QWebPluginFactory jest tworzenie obiektów na podstawie pasujących mime-types #include <QWebPluginFactory> class PluginFactory : public QWebPluginFactory { Q_OBJECT public: explicit PluginFactory(QObject *parent = 0); }; QObject *create(const QString &mimetype, const QUrl &url, const QStringList &argumentnames, const QStringList &argumentvalues) const; QList<Plugin> plugins() const;

QObject *PluginFactory::create(const QString &mimetype, const QUrl &url, const QStringList &argumentnames, const QStringList &argumentvalues) const { QWidget *result = 0; if(mimetype == "application/x-qt-calendar") { result = new QCalendarWidget(); for(int i=0; i<argumentnames.count(); ++i) result->setproperty(argumentnames[i].tolatin1().constdata(), argumentvalues[i]); } } return result;

Zanim wtyczki mogą być załadowane, muszą zostać włączone poprzez obiekt typu QWebSettings QWebView view; view.settings()->setattribute( QWebSettings::PluginsEnabled, true); Fabryka musi następnie zostać osadzona na stronie internetowej view->page()->setpluginfactory( new PluginFactory(this));

<html> <body> <h1>integrated Widget</h1> <p> <object type="application/x-qt-calendar"> <param name="gridvisible" value="true" /> </object> <object type="application/x-qt-calendar"> <param name="gridvisible" value="false" /> </object> </p> </html>

DOM (ang. Document Object Model) jest dostępny z poziomu instancji klasy QWebElement QWebPage QWebFrame QWebElement

Każda instancja QWebFrame zawiera element documentelement. Jest to główny element każdej ramki QWebView *view =...; QWebFrame *frame = view->page()->currentframe(); QWebElement documentroot = frame->documentelement();

Z poziomu każdego elementu QWebElement możliwa jest nawigacja bądź przeszukiwanie: nawigacja firstchild zwraca pierwszy, podrzędny element nextsibling zwraca następny, siostrzany element isnull jeżeli nie ma żadnych potomków/rodzeństwa przeszukiwanie findfirst i findall przyjmuje selektor css jako argument, tj. findall(".nazwa_klasy")

Każdy QWebElement zawiera komplet informacji o aktualnym elementcie: <a href="http://tomaszx.pl/developer/qt-roadmap">qt Road map</a> e.tagname = "A" e.toplaintext = "Qt Road map" e.classes = QStringList() e.attributenames = QStringList("href") e.attribute("href") = "http://tomaszx.pl/developer/qtroadmap"

Możliwa jest modyfikacja elementów typu QWebElements na wiele sposobów: enclosewith otacza dany element innym setattribute ustawia wartość atrybutu toggleclass ustawia/usuwa klasę setplaintext / setinnerxml zamienia zawartość danego elementu setouterxml zastępuje element i jego zawartość

Możliwa jest integracja elementów Qt z językiem JavaScript: Dostęp do obiektów Qt z poziomu JavaScript Wywoływanie kodu JavaScript z poziomu Qt Jest to mechanizm pozwalający na tworzenie aplikacji hybrydowych o dowolnym poziomie skomplikowania

Z poziomu JavaScript możliwy jest dostęp do właściwości i slotów danego obiektów Wywołaj addtojavascriptwindowobject na rzecz QWebFrame by dodać obiekt do tej ramki view->page()->currentframe()-> addtojavascriptwindowobject("helloqt", javascriptobject); Po załadowaniu się strony, wszystkie referencje do obiektów są czyszczone i emitowany jest sygnał javascriptwindowobjectcleared Dodawanie obiektów powinno nastąpić z poziomu slotu połączonego z tym sygnałem

class MyJavaScriptObject : public QObject { Q_OBJECT Q_PROPERTY(QString text READ text WRITE settext) public: explicit MyJavaScriptObject(QObject *parent = 0); const QString &text() const; public slots: void setgreeting(); void settext(const QString &text);... };

<html> <body> <h1>javascript Integration</h1> <div><span id="greeting">hello World!</span> <button type="button" onclick="helloqt.setgreeting();"> Change Text! </button> </div> <div> <input type="text" id="textinput" /> <button type="button" onclick="helloqt.settext(textinput.value);"> Update! </button> </div> </body> </html>

Kod JavaScript może zostać wykonany dzięki metodzie evaluatejavascript dostępnej z poziomu obiektów typu QWebFrame i QWebElement view->page()->currentframe()-> evaluatejavascript(qstring("textinput.value=\"%1\"").arg(text)); Sygnał loadfinished jest emitowany przez QWebPage kiedy strona zostanie całkowicie załadowana. Jest to dobry punkt do wywoływania kodu JavaScript

Klasa QWebPage zawiera wiele metod chronionych, których użycie bądź przeciążenie powinny być brane pod uwagę podczas tworzenia aplikacji hybrydowych. Często używane to: javascriptalert javascriptconfirm javascriptconsolemessage javascriptprompt createwindow Sygnały Slot windowcloserequested printrequested shouldinterruptjavascript

Moduł QtWebKit wykorzystuje instancję QNetworkAccessManager by uzyskać dostęp do sieci Menedżer ten pozwala na: Obsługę żądań i odpowiedzi Wykorzystanie pamięci podręcznej Zarządzanie plikami cookies Wykorzystanie proxy Pracę jako tłumacz protokołów

QNetworkRequest QNetworkReply QNetworkAccessManager QNetworkProxyFactory QAbstractNetworkCache QNetworkCookieJar

Przykład ściąganie pliku przez HTTP z wykorzystaniem QNetworkAccessManager QNetworkAccessManager *manager = new QNetworkAccessManager(this); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(downloadDone(QNetworkReply*))); manager->get(qnetworkrequest(qurl("http://doc.qt.io/images/logo.png"))); MyClass::downloadDone(QNetworkReply *reply) { QImageReader reader(reply, "png"); mimage = reader.read()); emit imagechanged(mimage); reply->deletelater(); }

Dziedzicząc po QNetworkAccessManager możliwe jest uzyskanie interfejsu webowego dla niemalże dowolnego protokołu sieciowego (źródła danych) Przykład implementacji klienta FTP wykorzystujący wspomnianą metodologię dostępny jest pod adresem: https://doc.qt.io/archives/qq/32/qq32-webkitprotocols.html

HTTP, FTP, SMTP, POP, IMAP, etc TCP IP (IPv4 and IPv6) Przeglądanie stron internetowych implikuje wykorzystanie protokoły HTTP Czasem zawartość jest szyfrowana (protokół https) HTTP zbudowany jest na podstawie TCP a ten na podstawie IP Istnieje wiele innych, popularnych protokołów bazujących na TCP/IP, jak FTP, SMTP, POP, IMAP

Klasa QFtp stanowi praktyczną implementacje protokołu FTP FTP pozwala m. in. na: Logowanie do serwerów Listowanie plików Poruszanie się po systemie plików Wgrywanie i sciąganie plikó

By ściągnąć plik ftp.qt.io/qt/source/readme wykorzystując obiekt QFtp należy podjąć następujące kroki: connecttohost("ftp.qt.io") login get("/qt/source/readme") close

Klasa QUrl dostarcza metod by podzielić URL na szereg części ftp://ftp.tomaszx.pl /qt/sources/readme protokół host ścieżka QUrl url("ftp://tomaszx.pl/qt/sources/readme"); QString host = url.host(); QString path = url.path();

Każda komenda wydawana przez QFtp działa w sposób asynchroniczny Gdy komenda zakończy działanie, sygnał commandfinished(int id, bool error) zostanie wyemitowany id identyfikator (jako liczba całkowita) danej komendy, error przyjmuje wartość true jeżeli pojawił się jakiś błąd przy wykonywaniu komendy

Wszystkie komendy mogą zostać wydane jednocześnie Możliwe jest też stworzenie prostego automatu ze stanami void Downloader::start() { m_ftpstate = Connecting; m_ftp->connecttohost(host); } void Downloader::ftpFinished(int, bool error) { switch(m_ftpstate) { case Connecting: m_ftpstate = LoggingIn; m_ftp->login(); break; case LoggingIn: m_ftpstate = Downloading; m_ftp->get(file, 0, QFtp::Ascii); break; case Downloading: result = m_ftp->readall(); m_ftpstate = Disconnecting; m_ftp->close(); break; case Disconnecting: m_ftpstate = Inactive; break; } }

HTTP, FTP bazują na TCP/IP HTTP, FTP, SMTP, POP, IMAP, etc TCP, UDP Qt posiada klasy, które uławiają pracę z TCP i UDP bezpośrednio (na poziomie gniazd sieciowych) IP (IPv4 and IPv6)

TCP Sockets Gwarancja zachowania kolejności danych Tylko komunikacja typu punkt-punkt Dobre, gdy wymagane jest dostarczenie danych UDP Sockets Mechanizm typu uruchom i zapomnij Komunikacja typu punkt-punkt lub broadcast Dobre, gdy czas dostarczenia jest priorytetem

W Qt dostępne są 2 klasy do obsługi TCP: QTcpSocket reprezentuje gniazdo sieciowe, QTcpServer reprezentuje serwer nasłuchujący na komunikację, Generuje instancje typu QTcpSocket dla każdego połączenia. Następny przykład pokazuje budowę prostego serwera powitalnego

Serwer składa się z obiektu typu QTcpServer nasłuchującego na porcie 55555 Generuje sygnał newconnection co połączenie Server::Server() : QObject(0) { m_tcpserver = new QTcpServer(this); connect(m_tcpserver, SIGNAL(newConnection()), this, SLOT(serverConnected())); } m_tcpserver->listen(qhostaddress::any, 55555);

Następne połączenie jest pobierane poprzez metodę nextpendingconnection void Server::serverConnected() { QTcpSocket *connection = m_tcpserver->nextpendingconnection(); connect(connection, SIGNAL(disconnected()), connection, SLOT(deleteLater())); QByteArray buffer;... } connection->write(buffer); connection->disconnectfromhost();

Odpowiedź jest umieszczana w buforze void Server::serverConnected() {... QByteArray buffer; QDataStream out(&buffer, QIODevice::WriteOnly); out.setversion(qdatastream::qt_4_6); Używając QDataStream przy gniazdach sieciowych, wielkość danych należy obsłużyć ręcznie } QString greeting = QString("Hello! The time is %1").arg(QTime::currentTime().toString()); out << (quint16)0; out << greeting; out.device()->seek(0); out << (quint16)(buffer.size() - sizeof(quint16));...

Wykorzystuje QTcpSocket by połączyć się z hostem Sygnał readyread jest jedynym wymaganym do obsłużenia (ale warto znać inne) Client::Client() : QObject(0) { m_tcpsocket = new QTcpSocket(this); connect(m_tcpsocket, SIGNAL(readyRead()), this, SLOT(readyToRead())); } m_tcpsocket->connecttohost("localhost", 55555);

void Client::readyToRead() { QDataStream in(m_tcpsocket); in.setversion(qdatastream::qt_4_6); Wykorzystuje bufor QTcpSocket jako wyjściowy if(m_tcpblocksize == 0) { if(m_tcpsocket->bytesavailable()<sizeof(quint16)) return; } in >> m_tcpblocksize; if(m_tcpsocket->bytesavailable() < m_tcpblocksize) return; } QString greeting; in >> greeting; dosomething(greeting); m_tcpblocksize = 0;

Przedstawiony protokół jest bardzo prosty: Odpowiedz na wszystkie połączenia i zakończ połączenie. W rzeczywistych zastosowaniach: Protokół po podłączeniu zostaje otwarty i oczekuje na określone komendy sterujące przepływem Wykorzystuje często wersjonowanie (w odniesieniu do klientów i serwera)

Połączenie TCP/IP łatwo można podsłuchiwać Klasa QSslSocket dostarcza mechanizmów szyfrowania w komunikacji Główna różnica polega na wykorzystaniu metody connecttohostencrypted SSL jest warstwą nad TCP Bazuje na tzw. CA Certificate Authorities

Klasa QUdpSocket dostarcza gniazda typu UDP Protokół wykorzystywany jest zarówno przez klienta jak i serwer Datagramy wysyłane są jako jeden blok Zwykle datagram ma od 512 do 8192 bajtów, choć i większe wartości mogą działać Może, ale nie musi zostać dostarczony Kolejność może nie zostać zachowana Mogą zdarzyć się duplikaty