Systemy Rozproszone - Ćwiczenie 6

Podobne dokumenty
Remote Method Invocation 17 listopada 2010

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Podejście obiektowe do budowy systemów rozproszonych

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

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ć

Wywoływanie metod zdalnych

Wywoływanie metod zdalnych

Aplikacje RMI

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

Aplikacje RMI Lab4

Programowanie rozproszone w języku Java

Interfejsy w Javie. Przykład zastosowania interfejsów:

Aplikacje RMI. Budowa aplikacji rozproszonych. Część 2.

Systemy rozproszone. Dr inż. L. Miękina. Department of Robotics and Mechatronics AGH University of Science and Technology 1/1

Remote Method Invocation

sieć 4) Mechanizm RMI jest zazwyczaj wykorzystywany w rozwiązaniach typu klient-serwer.

Rozproszone systemy internetowe. Wprowadzenie. Koncepcja zdalnego wywołania procedury

Java programowanie w sieci. java.net RMI

Tworzenia aplikacji rozproszonej RMI

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Programowanie obiektowe

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

1. Co można powiedzieć o poniższym kodzie?

Tworzenie i wykorzystanie usług

Programowanie obiektowe

Java: interfejsy i klasy wewnętrzne

Aplikacja wielowątkowa prosty komunikator

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Zdalne wywołanie procedur. Krzysztof Banaś Systemy rozproszone 1

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Michał Jankowski. Remoting w.net 2.0

Systemy Rozproszone - Ćwiczenie 4

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Klasy abstrakcyjne, interfejsy i polimorfizm

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

Dawid Gierszewski Adam Hanasko

1. Co można powiedzieć o poniższym kodzie (zakładając, że zaimportowano wszystkie niezbędne klasy)?

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

Kurs programowania. Wykład 9. Wojciech Macyna

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Zaawansowane aplikacje WWW - laboratorium

Przykład -

Wykład 8: Obsługa Wyjątków

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

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Metody Metody, parametry, zwracanie wartości

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

KLASY, INTERFEJSY, ITP

1. Co można powiedzieć o poniższym kodzie (zakładając, że znajduje się on w jednym pliku A.java)?

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Aplikacja wielow tkowa prosty komunikator

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Komponenty sterowane komunikatami

MAS dr. Inż. Mariusz Trzaska. Realizacja różnych modeli dziedziczenia w obiektowych językach programowania

Stanowe komponenty sesyjne

Programowanie obiektowe

Git, Bitbucket, IntelliJ IDEA

SWING c.d. przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe.

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Platformy Programistyczne Wykład z Javy dla zaawansowanych

Prototype (prototyp) Cel: Przykład: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp.

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

Aplikacje internetowe i rozproszone - laboratorium

Programowanie obiektowe i zdarzeniowe

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

1 Atrybuty i metody klasowe

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Java Platform Micro Edition

Budowa aplikacji w technologii. Enterprise JavaBeans. Maciej Zakrzewicz PLOUG

Bezstanowe komponenty sesyjne i zdarzenia zwrotne

Aplikacje w środowisku Java

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

Łukasz Przywarty Wrocław, r. Grupa: WT/N 11:15-14:00. Sprawozdanie z zajęć laboratoryjnych: OpenSSL - API

Współbieżność w środowisku Java

Dokumentacja do API Javy.

Wprowadzenie do technologii Web Services: SOAP, WSDL i UDDI

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

Wykład 7: Pakiety i Interfejsy

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

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Platformy Programistyczne Podstawy języka Java

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wykład 5 Okna MDI i SDI, dziedziczenie

Wprowadzanie danych z klawiatury. Wyjątki związane z wprowadzaniem danych, przekroczeniem rozmiaru tablicy, dzieleniem przez zero itd.

Transkrypt:

Systemy Rozproszone - Ćwiczenie 6 1 Obiekty zdalne Celem ćwiczenia jest stworzenie obiektu zdalnego świadczącego prostą usługę nazewniczą. Nazwy i odpowiadające im punkty końcowe będą przechowywane przez obiekt w tablicy. Metoda insert dodaje punkt końcowy (hostname, portnumber) o nazwie s. Metoda search zwraca indeks w tablicy dla nazwy s. Metody gethostname i getport zwracają nazwę hosta i port dla zadanego indeksu w tablicy. 1.1 Interfejs obiektu zdalnego Pierwszym krokiem przy tworzeniu obiektu zdalnego jest określenie jego interfejsu, który dziedziczy po klasie java.rmi.remote. Każda metoda interfejsu musi być zadeklarowana jako zgłaszająca wyjątek java.rmi.remoteexception. p l i k RMINameService. java import java. rmi. ; public interface RMINameService extends Remote { public int search ( S t r i n g s ) throws RemoteException ; public int i n s e r t ( S t r i n g s, S t r i n g hostname, int portnumber ) throws RemoteException ; public int getport ( int index ) throws RemoteException ; public S t r i n g gethostname ( int index ) throws RemoteException ; 1.2 Implementacja obiektu zdalnego Klasa dla obiektu zdalnego musi dziedziczyć po java.rmi.server.unicastremoteobject i implementować interfejs, który został zadeklarowany w rozdziale 1.1. W metodzie main tworzony jest obiekt zdalny klasy RMINameServer. Nastepnie, ten obiekt jest eksportowany przy pomocy metody UnicastRemoteObject.exportObject(). W wyniku eksportu otrzymujemy namiastkę obiektu zdalnego (typu RMINameService), 1

którą należy skojarzyć z określoną nazwą w rejestrze RMI przy poprzez wywołanie Registry.rebind() import java. rmi. ; import java. rmi. r e g i s t r y. ; import java. rmi. s e r v e r. UnicastRemoteObject ; public c l a s s RMINameServer extends UnicastRemoteObject implements RMINameService { f i n a l int maxsize = 100; private S t r i n g [ ] names = new S t r i n g [ maxsize ] ; private S t r i n g [ ] h o s t s = new S t r i n g [ maxsize ] ; private int [ ] p o r t s = new int [ maxsize ] ; private int d i r S i z e = 0 ; public RMINameServer ( ) throws RemoteException { public int search ( S t r i n g s ) throws RemoteException { for ( int i = 0 ; i < d i r S i z e ; i++) { i f ( names [ i ]. e q u a l s ( s ) ) { return i ; return 1; public int i n s e r t ( S t r i n g s, S t r i n g hostname, int portnumber ) throws RemoteException { int oldindex = search ( s ) ; i f ( ( oldindex == 1) && ( d i r S i z e < maxsize ) ) { names [ d i r S i z e ] = s ; h o s t s [ d i r S i z e ] = hostname ; p o r t s [ d i r S i z e ] = portnumber ; d i r S i z e ++; return 1 ; return 0 ; public int getport ( int index ) throws RemoteException { return p o r t s [ index ] ; 2

public S t r i n g gethostname ( int index ) throws RemoteException { return h o s t s [ index ] ; public static void main ( S t r i n g [ ] args ) { try { RMINameServer o b j = new RMINameServer ( ) ; UnicastRemoteObject. unexportobject ( obj, true ) ; System. out. p r i n t l n ( " Exporting... " ) ; RMINameService s t u b = ( RMINameService ) UnicastRemoteObject. exportobject ( obj, 0) ; R e g i s t r y r e g i s t r y ; i f ( true ) { // s t w o r z e n i e nowego r e j e s t r u na l o c a l h o s c i e r e g i s t r y = LocateRegistry. c r e a t e R e g i s t r y (1099) ; System. out. p r i n t l n ( "New r e g i s t r y c r e a t e d on l o c a l h o s t " ) ; else { System. out. p r i n t l n ( " Locating r e g i s t r y... " ) ; // p o d l a c z e n i e do i s t n i e j a c e g o r e j e s t r u na l o c a l h o s c i e r e g i s t r y = LocateRegistry. g e t R e g i s t r y ( " l o c a l h o s t " ) ; System. out. p r i n t l n ( " R e g i s t r y l o c a t e d " ) ; r e g i s t r y. rebind ( "MyNameServer", stub ) ; System. out. p r i n t l n ( "RMINameService bound, ready " ) ; catch ( Exception e ) { System. e r r. p r i n t l n ( "RMINameService e x c e p t i o n : " ) ; e. printstacktrace ( ) ; 1.3 Klient import java. rmi. ; import java. rmi. r e g i s t r y. ; 3

public class RMIClient { public static void main ( S t r i n g [ ] args ) { try { System. out. p r i n t l n ( " L i s t o f r e g i s t e r e d REMOTE o b j e c t s : " ) ; for ( S t r i n g s : Naming. l i s t ( "// l o c a l h o s t " ) ) { System. out. p r i n t l n ( s ) ; System. out. p r i n t l n ( " Getting r e g i s t r y " ) ; R e g i s t r y reg = LocateRegistry. g e t R e g i s t r y ( " l o c a l h o s t " ) ; System. out. p r i n t l n ( " Getting i n t e r f a c e " ) ; RMINameService s = ( RMINameService ) r e g. lookup ( " MyNameServer" ) ; System. out. p r i n t l n ( "Got i n t e r f a c e " ) ; s. i n s e r t ( " foo ", " 1 9 2. 1 6 8. 1. 1 ", 10000) ; s. i n s e r t ( " bar ", " 1 9 2. 1 6 8. 1. 2 ", 10000) ; s. i n s e r t ( " baz ", " 1 9 2. 1 6 8. 1. 3 ", 10000) ; S t r i n g s e a r c h _ s t r i n g = " foo " ; int i = s. search ( s e a r c h _ s t r i n g ) ; i f ( i!= 1) { System. out. p r i n t l n ( s. gethostname ( i ) + " : " + s. getport ( i ) ) ; else { System. out. p r i n t l n ( s e a r c h _ s t r i n g + " not found " ) ; catch ( Exception e ) { e. printstacktrace ( ) ; 2 Zadanie 1 - Kalkulator Zaimplementuj kalkulator jako obiekt zdalny. 4

3 Zadanie 2 - Bank Stwórz prosty system bankowy, która umożliwa klientowi banku zalogowanie się do systemu i przeprowadzenie podstawowych operacji na swoim koncie. Metody zdalne do zaimplementowania po stronie serwera: Autoryzacja k l i e n t a na podstawie pary ( numer konta, kod pin ) i r o z p o c z e c i e s e s j i ( zalogowanie ) account : numer konta pin : pin p r z y p i s a n y do konta Uwagi : Metoda zwraca token autoryzacyjny, k t o r y j e s t generowany i zapamietywany p r z e z serwer ( losowy c i a g znakow ). Token potrzebny j e s t do a u t o r y z a c j i k o l e j n y c h o p e r a c j i wykonywanych na tym koncie S t r i n g a u t h o r i z e ( int account, int pin ) Zapytanie o stan konta Zwraca stan konta ( i l o s c p i e n i e d z y na koncie ) double getbalance ( S t r i n g token ) Wplata p i e n i e d z y na konto v a l u e : kwota do wplaty void d e p o s i t ( S t r i n g token, double value ) Wyplata p i e n i e d z y z konta v a l u e : kwota do wyplaty Zwraca f a l s z, gdy brak srodkow na koncie do przeprowadzenia o p e r a c j i 5

boolean withdraw ( S t r i n g token, double value ) Przelew p i e n i e d z y na inne konto account : nr konta na k t o r e zostana p r z e l a n e p i e n i a d z e v a l u e : kwota do wyplaty Zwraca f a l s z, gdy brak srodkow na koncie do przeprowadzenia o p e r a c j i boolean withdraw ( S t r i n g token, int account, double value ) Konczy s e s j e ( wylogowanie ) Uwagi : Serwer powinien usunac token ( o i l e j e s t on prawidlowy ) void bye ( S t r i n g token ) Przykład użycia kodu po stronie klienta: BankingService atm =...... // o b i e k t zdalny o d p o w i e d z i a l n y za o b s l u g e kont bankowych S t r i n g token = atm. a u t h o r i z e (123456,1111) ; i f ( token!= null ) { // wplacam 100 z l na konto atm. d e p o s i t ( token, 100) ; // sprawdzam stan konta double balance = atm. getbalance ( token ) ; System. out. p r i n t l n ( " Stan konta : "+balance ) ; // wyplacam p i e n i a d z e z konta atm. withdraw ( token, 50) ; // wplacam p i e n i a d z e na konto nr 112233 atm. t r a n s f e r ( token, 112233, 25) ; // ponownie sprawdzam stan konta System. out. p r i n t l n ( " Stan konta : "+atm. getbalance ( token ) ) ; 6