Ćwiczenia IX Qt — ubsługa połączeń sieciowych

Transkrypt

Ćwiczenia IX Qt — ubsługa połączeń sieciowych
Ćwiczenia IX
Qt — ubsługa połączeń sieciowych
14 grudnia 2010
Moduł QtNetwork Do obsługi połączeń sieciowych używamy klas z modułu QtNetwork.
Klient W przypadku klienta podstawową klasą jest QTcpSocket. Obiekt tej klasy (zwany gniazdem) reprezentuje połączenie sieciowe (protokołu TCP). Klasa ta dziedziczy pośrednio po QIODevice, więc można w pewnym stopniu traktować obiekty klasy QTcpSocket, jak pliki — czytać i pisać z nich.
Komunikacja sieciowa różni się jednak od czytania z pliku tym, że jest asynchroniczna
— nie wszystkie dane, które wczytamy z gniazda, są dostępne natychmiast. Dodatkowo
nie jesteśmy w stanie określić, kiedy kolejna porcja danych dotrze do gniazda, abyśmy
mogli je wczytać.
Z tego powodu warto zwrócić uwagę na sygnał readyRead(), który jest emitowany,
gdy pojawiają się dane gotowe do czytania.
Dodatkowo przy zmianie stanu gniazda (szukanie hosta, łączenie, połączenie, rozłączenie), emitowany jest sygnał stateChanged().
Serwer Aby stworzyć serwer wykorzystujący protokół TCP, użyjemy klasy QTcpServer.
Serwer powinien zacząć nasłuchiwać nadchodzące połączenia — należy wywołać metodę
QTcpServer::listen(). W momencie, gdy jakiś klient połączy się, obiekt serwera wyemituje sygnał newConnection(). Aby uzyskać obiekt klasy QTcpSocket, który jest gniazdem
połączonym z klientem, w slocie obsługującym ten sygnał należy wywołać metodę nextPendingConnection().
Po tych krokach możemy traktować połączone gniazdo (w serwerze), jak gniazdo
po drugiej stronie — w kliencie. Natomiast obiekt serwer (klasy QTcpServer) nadal nasłuchuje i oczekuje na nowe połączenia, które w dalszym ciągu możemy obsługiwać w sposób
asynchroniczny za pomocą mechanizmu slotów i sygnałów.
Uwagi końcowe
• Do uruchomienia serwera nasłuchującego na porcie mniejszym od 1024, wymagane
są uprawnienia roota.
• W aplikacji typu serwer nie jest wymagane tworzenie okien. W związku z tym
w funkcji main zamiast tworzyć obiekt klasy QApplication, tworzymy obiekt klasy
QCoreApplication. Ponadto główny obiekt, dotychczas odpowiedzialny za utworzenie okna głównego aplikacji, nie musi już dziedziczyć po QWidget.
• Jeśli korzystamy z modułu QtNetwork, po utworzeniu pliku projektu, a przed utworzeniem pliku Makefile, należy do pliku projektu dodać linię: „QT += network”.
Ćwiczenia
1. Pobierz źródła programu client, rozpakuj i skompiluj. Uruchom (koniecznie w terminalu) podając jako parametry uruchomieniowe nazwę hosta oraz numer portu.
Przykładem użycia programu może być „podejrzenie” działania protokułu HTTP:
• jako nazwę hosta podaj dowolny adres serwera www (bez „http://”)
• wymagany numer portu to 80
• w polu wprowadzania tekstu wpisz „GET /“.
Podobny efekt możemy uzyskać, wydając w terminalu polecenie „telnet host 80”.
2. Napisz serwer „echo”, który odpisuje klientowi wszystko, co ten do niego napisze.
Program powinien obsługiwać wiele klientów niezależnie od siebie.
3. Zmodyfikuj pierwszy program z ósmych zajęć tak, by kurs waluty pobierał w momencie uruchomienia ze strony internetowej NBP. Do parsowania dokumentu HTML
możesz użyć np. wyrażeń regularnych lub wiadomości zdobytych na poprzednich zajęciach.
2