Architektury systemów rozproszonych LABORATORIUM. Ćwiczenie 1



Podobne dokumenty
Qt in Education. Sieć I drukowanie

Akademia Techniczno-Humanistyczna w Bielsku-Białej

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

Platformy Programistyczne Zagadnienia sieciowe i wątki

Aplikacja Sieciowa wątki po stronie klienta

Poradnik korzystania z usługi FTP

Mechanizmy pracy równoległej. Jarosław Kuchta

Politechnika Łódzka. Instytut Systemów Inżynierii Elektrycznej. Laboratorium przyrządów wirtualnych. Ćwiczenie 4

Programowanie rozproszone w języku Java

DYNAMICZNE PRZYDZIELANIE PAMIECI

Serwer SSH. Wprowadzenie do serwera SSH Instalacja i konfiguracja Zarządzanie kluczami

Tworzenie aplikacji rozproszonej w Sun RPC

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Aplikacja wielowątkowa prosty komunikator

Wybrane działy Informatyki Stosowanej

Komunikacja z użyciem gniazd aplikacje klient-serwer

Programowanie współbieżne i rozproszone

Klient-Serwer Komunikacja przy pomocy gniazd

Instrukcja instalacji Control Expert 3.0

Dokumentacja aplikacji Szachy online

Aplikacja wielow tkowa prosty komunikator

Programy typu klient serwer. Programowanie w środowisku rozproszonym. Wykład 5.

Programowanie zespołowe

Prosta aplikacja klient - serwer na bazie protokoªu UDP. Sprawozdanie.

Systemy Rozproszone - Ćwiczenie 6

Problemy techniczne SQL Server

Aplikacje WWW - laboratorium

Tomasz Greszata - Koszalin

Aplikacja Sieciowa. Najpierw tworzymy nowy projekt, tym razem pracować będziemy w konsoli, a zatem: File->New- >Project

Jak wykorzystać Pulpit Zdalny w Windows 2003 Serwer do pracy z programem FAKT

Komunikator internetowy w C#

Instrukcja obsługi serwera FTP v

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

Aplikacje RMI

Wykład 4: Protokoły TCP/UDP i usługi sieciowe. A. Kisiel,Protokoły TCP/UDP i usługi sieciowe

Ćwiczenie 8 Implementacja podpisu cyfrowego opartego na standardzie X.509

Relacyjne, a obiektowe bazy danych. Bazy rozproszone

Michał Jankowski. Remoting w.net 2.0

Kolejkowanie wiadomości Standard MQ (JMS)

Przykład. Podaj nazwę domenową hosta a odczytaj jego adres IP, lub odwrotnie:

SIP Studia Podyplomowe Ćwiczenie laboratoryjne Instrukcja

Przykłady interfejsu TCP i UDP w Javie

Ćwiczenie nr: 9 Obliczenia rozproszone MPI

Automatyczne anulowanie zleceń w wyniku odłączenia od CCG

Gniazda UDP. Bartłomiej Świercz. Łódź, 3 kwietnia Katedra Mikroelektroniki i Technik Informatycznych. Bartłomiej Świercz Gniazda UDP

Dokumentacja techniczna

ROZPROSZONE SYSTEMY OPERACYJNE Dokumentacja końcowa Realizacja niezawodnych usług w OpenSSI. Marcin Najs 16 czerwca 2005

DotGadu Tutorial v2008_08_25 Dominik Cebula

Problem Próby rozwiązania Maszyna stanów Inne zastosowania Podsumowanie. Maszyny stanów. Programowanie gier bez Unity, cz. 3.

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

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

Instrukcja konfiguracji programu Fakt z modułem lanfakt

KONFIGURACJA SIECIOWA SYSTEMU WINDOWS

Data wykonania Część praktyczna

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Tym razem nie skorzystamy z mechanizmu. Podglądanie pulpitu

Wybrane działy Informatyki Stosowanej

Protokoły zdalnego logowania Telnet i SSH

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

Instrukcja instalacji usługi Sygnity SmsService

Serwery Statefull i Stateless

Podejście obiektowe do budowy systemów rozproszonych

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

Udostępnianie drukarek za pomocą systemu Windows (serwer wydruku).

Analiza malware Remote Administration Tool (RAT) DarkComet

Dokumentacja smsapi wersja 1.4

INSTRUKCJA INSTALACJI I PIERWSZEGO URUCHOMIENIA APLIKACJI Rodzajowa Ewidencja Wydatków plus Zamówienia i Umowy

Instrukcja instalacji usługi Sygnity SmsService

Wszystkie parametry pracy serwera konfigurujemy w poszczególnych zakładkach aplikacji, podzielonych wg zakresu funkcjonalnego.

!!" % & $ ( # # ( ( # ( ( TalentowiSKO talenty dodajemy, mnoīymy, potċgujemy. TalentowiSKO@bankbps.pl tel TalentowiSKO.

Spring Web MVC, Spring DI

SERWER AKTUALIZACJI UpServ

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Opis protokołu RPC. Grzegorz Maj nr indeksu:

Laboratorium Ericsson HIS NAE SR-16

Sieci komputerowe i bazy danych

Tytuł: Instrukcja obsługi Modułu Komunikacji internetowej MKi-sm TK / 3001 / 016 / 002. Wersja wykonania : wersja oprogramowania v.1.

Konfiguracja serwera OPC/DDE KEPSServerEX oraz środowiska Wonderware InTouch jako klienta DDE do wymiany danych

Systemy Rozproszone Technologia ICE

PRZETWARZANIE ROZPROSZONE ZADAN` Mariusz Gil 4Developers 2012, Poznań

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

DECLARE VARIABLE zmienna1 typ danych; BEGIN

INSTRUKCJA OBSŁUGI USTAWIEŃ DYNAMICZNIE PRZEDZIELANYCH ADRESÓW IP W URZĄDZENIACH SYSTEMU IP-PRO ORAZ REJESTRATORACH MY-DVR

Usługi sieciowe systemu Linux

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Instalacja i konfiguracja Symfonia.Common.Server oraz Symfonia.Common.Forte

Instrukcja dla instalatora systemu SMDP Enterprise/Professional

Zdalne zarządzanie systemem RACS 5

SYSTEMY ZABEZPIECZEŃ. Poradnik. Wirtualne sieci prywatne - VPN. Wymagania wstępne LAN. Internet VPN

Zanim zaczniesz. Warto ustawić kartę sieciową naszego serwera.

Laboratorium 3.4.3: Usługi i protokoły

Instrukcje instalacji pakietu IBM SPSS Data Access Pack dla systemu Windows

Lab 2 ĆWICZENIE 2 - VLAN. Rodzaje sieci VLAN

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 4

SERWER AKTUALIZACJI UpServ

Podstawy sieci komputerowych. Technologia Informacyjna Lekcja 19

Instrukcja instalacji aplikacji i konfiguracji wersji sieciowej. KomKOD

RMI-2. Java Remote Method Invocation (RMI) na podstawie m.in. podręcznika firmy Sun Microsystems SYSTEMY ROZPROSZONE

Definiowanie drukarek w programie ZAFIR

Transkrypt:

Architektury systemów rozproszonych LABORATORIUM Ćwiczenie 1 Temat: Aplikacja klient-serwer - implementacja w środowisku QT Creator. Przykładowy projekt aplikacji typu klient - serwer został udostępniony na szkolnym serwerze. Przed przystąpieniem do realizacji ćwiczenia należy pobrać 2 archiwa: bin.zip - programy wykonywalne src.zip - źródła programów Projekt w aktualnej wersji umożliwia komunikację między komputerami podłączonymi w obrębie tej samej sieci lokalnej. Jako parametr wejściowy serwera podajemy port, na którym mają zdalnie łączyć się maszyny klienckie (rys. 1). Rys. 1. Aplikacja serwera. W aplikacji klienta podajemy 3 parametry: nick użytkownika, adres IP serwera oraz port na którym on nasłuchuje (rys. 2). Rys. 2. Aplikacja klienta. 1

W celu nawiązania komunikacji między użytkownikami, jeden z nich musi uruchomić program "Serwer" natomiast pozostali uruchamiają aplikację "Klient". Komputer pełniący funkcję serwera może być też klientem (rys. 3). Rys. 2. Funkcje komputerów w sieci podczas użytkowania aplikacji klient-serwer. SERWER Do obsługi połączenia od strony serwera w środowisku QT służy funkcja generująca sygnał newconnection(). Za pomocą funkcji connect() sygnał ten łączymy z własnym slotem o nazwie newclient(), który automatycznie zostanie utworzony podczas nowego połączenia. server = new QTcpServer(this); connect(server, SIGNAL(newConnection()), this, SLOT(newClient())); Aplikacja serwer sprawdza dostępność portu podanego przez użytkownika i jeśli jest on wolny to uruchamia serwer i rozpoczyna nasłuchiwanie. void MainWindow::on_pushButton_clicked() if(isrunning) isrunning = false; server->close(); ui->label_2->settext(tr("rozłączony")); ui->pushbutton->settext(tr("uruchom")); else if (!server->listen(qhostaddress::any, ui->lineedit->text().toint())) ui->label_2->settext(tr("błąd: serwer nie może być uruchomiony")); else QString ipaddress; QList<QHostAddress> ipaddresseslist = QNetworkInterface::allAddresses(); for (int i = 0; i < ipaddresseslist.size(); ++i) if (ipaddresseslist.at(i)!= QHostAddress::LocalHost && ipaddresseslist.at(i).toipv4address()) ipaddress = ipaddresseslist.at(i).tostring(); break; 2

if (ipaddress.isempty()) ipaddress = QHostAddress(QHostAddress::LocalHost).toString(); isrunning = true; ui->label_2->settext(tr("serwer słucha na IP: %1\nna porcie: %2").arg(ipAddress).arg(server->serverPort())); ui->pushbutton->settext(tr("rozłącz")); Dodanie klienta polega na stworzeniu dla niego gniazda (socket) i dodanie go na listę klientów. Następnie do slotów podłączane są sygnały: disconnected() - który automatycznie usuwa klienta w momencie utraty połączenia readyread() - do obsługi danych przychodzących od klienta QTcpSocket *socket = server->nextpendingconnection(); socketslist.push_back(socket); sizeslist.push_back(0); connect(socket, SIGNAL(disconnected()), this, SLOT(removeClient())); connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater())); connect(socket, SIGNAL(readyRead()), this, SLOT(sendToEveryone())); Usunięcie klienta następuje poprzez odczytanie jego ID. Jeśli klient nie odpowie to jest usuwany z listy. void MainWindow::removeClient() QTcpSocket *socket = (QTcpSocket*)sender(); int id = socketslist.indexof(socket); socketslist.removeat(id); sizeslist.removeat(id); W środowisku QT transmisja danych między komputerami można zrealizować wykorzystując klasy QDataStream oraz QByteArray. Poniżej została przedstawiona funkcja, która przesyła komunikat odebrany przez serwer od jednego z klientów do wszystkich występujących na liście serwera. 3

void MainWindow::sendToEveryone() QTcpSocket *socket = (QTcpSocket*) sender(); int id = socketslist.indexof(socket); QDataStream in(socket); in.setversion(qdatastream::qt_5_2); if (sizeslist.at(id) == 0) if (socket->bytesavailable() < (int)sizeof(quint16)) quint16 sizeofblock; in >> sizeofblock; sizeslist[id] = sizeofblock; if (socket->bytesavailable() < sizeslist.at(id)) QString nick; in >> nick; QString message; in >> message; QByteArray data; QDataStream out(&data, QIODevice::WriteOnly); out.setversion(qdatastream::qt_5_2); out << sizeslist.at(id); out << nick; out << message; for (int i = 0; i < socketslist.size(); ++i) if (i!= id) socketslist.at(i)->write(data); sizeslist[id] = (quint16)0; KLIENT W aplikacji klienta do odpowiednich slotów podłączamy sygnały do obsługi połączenia ze zdalnym serwerem. socket = new QTcpSocket(this); connect(socket, SIGNAL(readyRead()), this, SLOT(readData())); connect(socket, SIGNAL(connected()), this, SLOT(connectedToServer())); connect(socket,signal(disconnected()),this,slot(disconnect())); 4

Połączenie klienta z serwerem następuje przy użyciu funkcji ConnectToServer(). void MainWindow::connectToServer(QString ip, int port, QString nick) socket->abort(); blocksize = 0; socket->connecttohost(ip, port); this->nick = nick; Po nawiązaniu połączenia wywołana jest funkcja ConnectedToServer(). void MainWindow::connectedToServer() ui->textbrowser->clear(); ui->textbrowser->append(tr("połączono z serwerem")); isconnected = true; ui->pushbutton->settext(tr("rozłącz")); ui->lineedit->setenabled(false); ui->lineedit_2->setenabled(false); ui->lineedit_4->setenabled(false); ui->lineedit_3->setenabled(true); ui->pushbutton_2->setenabled(true); Odbiór danych przez klienta jest realizowany przez funkcję readdata(). void MainWindow::readData() QDataStream in(socket); in.setversion(qdatastream::qt_4_6); if (blocksize == 0) if (socket->bytesavailable() < (int)sizeof(quint16)) in >> blocksize; if (socket->bytesavailable() < blocksize) QString nick; in >> nick; QString message; in >> message; ui->textbrowser->append(nick + ": " + message); blocksize = 0; Funkcja disconnected() określa co zrobić w momencie utraty połączenia z serwerem. 5

void MainWindow::disconnect() isconnected = false; ui->pushbutton->settext(tr("połącz")); ui->lineedit->setenabled(true); ui->lineedit_2->setenabled(true); ui->lineedit_4->setenabled(true); ui->lineedit_3->setenabled(false); ui->pushbutton_2->setenabled(false); socket->close(); nick.clear(); ui->textbrowser->append(tr("połączenie zerwane")); Do wysyłania danych przez port TCP/IP służy funkcja sendmessage(). void MainWindow::sendMessage() ui->textbrowser->append(nick + ": " + ui->lineedit_3->text()); QByteArray data; QDataStream out(&data, QIODevice::WriteOnly); out.setversion(qdatastream::qt_5_2); out << (quint16) 0; out << nick; out << ui->lineedit_3->text(); out.device()->seek(0); out << (quint16) (data.size() - sizeof(quint16)); socket->write(data); ui->lineedit_3->clear(); ZADANIE: Należy zmodyfikować kody źródłowe aplikacji w ten sposób, aby stworzyć prosty generator liczb pseudolosowych. Klient wysyła komunikat do serwera o treści "random", a serwer zwraca liczbę wylosowaną z zakresu 0-1000. 6