Programowanie aplikacji rozproszonych w języku Java
Transkrypt
Programowanie aplikacji rozproszonych w języku Java
Wstęp Gniazda RMI Podsumowanie Programowanie rozproszone w języku Java Wojciech Rząsa [email protected] Katedra Informatyki i Automatyki, Politechnika Rzeszowska 29 kwietnia 2016 Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 1/46 Wstęp Gniazda RMI Podsumowanie Plan 1 Wstęp 2 Komunikacja sieciowa 3 Zdalne wywołanie metod (RMI) 4 Podsumowanie Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 2/46 Wstęp Gniazda RMI Podsumowanie Plan 1 Wstęp 2 Komunikacja sieciowa 3 Zdalne wywołanie metod (RMI) 4 Podsumowanie Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 3/46 Wstęp Gniazda RMI Podsumowanie Programowanie rozproszone Osobne procesory Rozdzielona przestrzeń adresowa Komunikacja poprzez sieć Duży narzut komunikacyjny Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 4/46 Wstęp Gniazda RMI Podsumowanie Modele programowania rozproszonego Message passing (przekazywanie wiadomości) Remote procedure call (zdalne wywoływanie procedur) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 5/46 Wstęp Gniazda RMI Podsumowanie Omówione mechanizmy Komunikacja sieciowa – gniazda (sockets) Zdalne wywołanie metod (RMI, odpowiednik RPC) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 6/46 Wstęp Gniazda RMI Podsumowanie Plan 1 Wstęp 2 Komunikacja sieciowa 3 Zdalne wywołanie metod (RMI) 4 Podsumowanie Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 7/46 Wstęp Gniazda RMI Podsumowanie Możliwości Przesyłanie danych pomiędzy procesami Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 8/46 Wstęp Gniazda RMI Podsumowanie Gniazdo Punkt końcowy kanału komunikacyjnego Każda strona ma własne gniazdo Pozwala wykonywać podstawowe operacje wejścia/wyjścia Operacje realizuje system operacyjny Komunikacja przez sieć Komunikacja lokalna Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 9/46 Wstęp Gniazda RMI Podsumowanie Komunikacja przy użyciu gniazd Model klient-serwer Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 10/46 Wstęp Gniazda RMI Podsumowanie Komunikacja przy użyciu gniazd Model klient-serwer Rozpoczęcie komunikacji Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 10/46 Wstęp Gniazda RMI Podsumowanie Komunikacja przy użyciu gniazd Model klient-serwer Rozpoczęcie komunikacji Pasywne (nasłuchiwanie) – serwer Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 10/46 Wstęp Gniazda RMI Podsumowanie Komunikacja przy użyciu gniazd Model klient-serwer Rozpoczęcie komunikacji Pasywne (nasłuchiwanie) – serwer Aktywne (inicjowanie połączenia) – klient Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 10/46 Wstęp Gniazda RMI Podsumowanie Komunikacja przy użyciu gniazd Model klient-serwer Rozpoczęcie komunikacji Pasywne (nasłuchiwanie) – serwer Aktywne (inicjowanie połączenia) – klient Typy gniazd Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 10/46 Wstęp Gniazda RMI Podsumowanie Komunikacja przy użyciu gniazd Model klient-serwer Rozpoczęcie komunikacji Pasywne (nasłuchiwanie) – serwer Aktywne (inicjowanie połączenia) – klient Typy gniazd Determinują protokół warstwy transportowej Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 10/46 Wstęp Gniazda RMI Podsumowanie Komunikacja przy użyciu gniazd Model klient-serwer Rozpoczęcie komunikacji Pasywne (nasłuchiwanie) – serwer Aktywne (inicjowanie połączenia) – klient Typy gniazd Determinują protokół warstwy transportowej gniazda strumieniowe protokół TCP komunikacja niezawodna dane jako strumień bajtów Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 10/46 Wstęp Gniazda RMI Podsumowanie Komunikacja przy użyciu gniazd Model klient-serwer Rozpoczęcie komunikacji Pasywne (nasłuchiwanie) – serwer Aktywne (inicjowanie połączenia) – klient Typy gniazd Determinują protokół warstwy transportowej gniazda strumieniowe protokół TCP komunikacja niezawodna dane jako strumień bajtów gniazda datagramowe protokół UDP komunikacja zawodna dane jako datagram Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 10/46 Wstęp Gniazda RMI Podsumowanie Komunikacja przy użyciu gniazd Model klient-serwer Rozpoczęcie komunikacji Pasywne (nasłuchiwanie) – serwer Aktywne (inicjowanie połączenia) – klient Typy gniazd Determinują protokół warstwy transportowej gniazda strumieniowe protokół TCP komunikacja niezawodna dane jako strumień bajtów gniazda datagramowe protokół UDP komunikacja zawodna dane jako datagram gniazda surowe (ang. raw sockets), niedostępne w Javie Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 10/46 Wstęp Gniazda RMI Podsumowanie Porty Adres IP – identyfikuje maszynę Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 11/46 Wstęp Gniazda RMI Podsumowanie Porty Adres IP – identyfikuje maszynę Numer portu – identyfikuje proces na maszynie Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 11/46 Wstęp Gniazda RMI Podsumowanie Porty Adres IP – identyfikuje maszynę Numer portu – identyfikuje proces na maszynie numery od 0 do 65536 Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 11/46 Wstęp Gniazda RMI Podsumowanie Porty Adres IP – identyfikuje maszynę Numer portu – identyfikuje proces na maszynie numery od 0 do 65536 0 zarezerwowane Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 11/46 Wstęp Gniazda RMI Podsumowanie Porty Adres IP – identyfikuje maszynę Numer portu – identyfikuje proces na maszynie numery od 0 do 65536 0 zarezerwowane od 1 do 1024 tylko administrator Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 11/46 Wstęp Gniazda RMI Podsumowanie Porty Adres IP – identyfikuje maszynę Numer portu – identyfikuje proces na maszynie numery od 0 do 65536 0 zarezerwowane od 1 do 1024 tylko administrator UDP i TCP mają osobną pulę portów Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 11/46 Wstęp Gniazda RMI Podsumowanie Porty Adres IP – identyfikuje maszynę Numer portu – identyfikuje proces na maszynie numery od 0 do 65536 0 zarezerwowane od 1 do 1024 tylko administrator UDP i TCP mają osobną pulę portów Serwer – nasłuchuje na wybranym porcie Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 11/46 Wstęp Gniazda RMI Podsumowanie Porty Adres IP – identyfikuje maszynę Numer portu – identyfikuje proces na maszynie numery od 0 do 65536 0 zarezerwowane od 1 do 1024 tylko administrator UDP i TCP mają osobną pulę portów Serwer – nasłuchuje na wybranym porcie Klient – używając jednego z lokalnych portów łączy się z wybranym IP i portem Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 11/46 Wstęp Gniazda RMI Podsumowanie Gniazda klienckie (TCP) [http://java.sun.com/docs/books/tutorial/networking/sockets/definition.html] Klient tworzy gniazdo Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 12/46 Wstęp Gniazda RMI Podsumowanie Gniazda klienckie (TCP) [http://java.sun.com/docs/books/tutorial/networking/sockets/definition.html] Klient tworzy gniazdo Podaje adres IP i numer portu z którym się łączy Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 12/46 Wstęp Gniazda RMI Podsumowanie Gniazda klienckie (TCP) [http://java.sun.com/docs/books/tutorial/networking/sockets/definition.html] Klient tworzy gniazdo Podaje adres IP i numer portu z którym się łączy Może podać lokalny numer portu Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 12/46 Wstęp Gniazda RMI Podsumowanie Gniazda klienckie (TCP) [http://java.sun.com/docs/books/tutorial/networking/sockets/definition.html] Klient tworzy gniazdo Podaje adres IP i numer portu z którym się łączy Może podać lokalny numer portu Jeśli połączenie jest przyjęte, może pisać i czytać z gniazda Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 12/46 Wstęp Gniazda RMI Podsumowanie Gniazda serwera (TCP) [http://java.sun.com/docs/books/tutorial/networking/sockets/definition.html] Serwer tworzy gniazdo Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 13/46 Wstęp Gniazda RMI Podsumowanie Gniazda serwera (TCP) [http://java.sun.com/docs/books/tutorial/networking/sockets/definition.html] Serwer tworzy gniazdo Podaje numer portu z którym ma się połączyć klient Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 13/46 Wstęp Gniazda RMI Podsumowanie Gniazda serwera (TCP) [http://java.sun.com/docs/books/tutorial/networking/sockets/definition.html] Serwer tworzy gniazdo Podaje numer portu z którym ma się połączyć klient Czeka na połączenie klienta Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 13/46 Wstęp Gniazda RMI Podsumowanie Gniazda serwera (TCP) [http://java.sun.com/docs/books/tutorial/networking/sockets/definition.html] Serwer tworzy gniazdo Podaje numer portu z którym ma się połączyć klient Czeka na połączenie klienta Po nadejściu i nawiązaniu nowego połączenia tworzy nowe gniazdo Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 13/46 Wstęp Gniazda RMI Podsumowanie Gniazda serwera (TCP) [http://java.sun.com/docs/books/tutorial/networking/sockets/definition.html] Serwer tworzy gniazdo Podaje numer portu z którym ma się połączyć klient Czeka na połączenie klienta Po nadejściu i nawiązaniu nowego połączenia tworzy nowe gniazdo nowe gniazdo jest wykorzystywane do komunikacji z klientem Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 13/46 Wstęp Gniazda RMI Podsumowanie Gniazda serwera (TCP) [http://java.sun.com/docs/books/tutorial/networking/sockets/definition.html] Serwer tworzy gniazdo Podaje numer portu z którym ma się połączyć klient Czeka na połączenie klienta Po nadejściu i nawiązaniu nowego połączenia tworzy nowe gniazdo nowe gniazdo jest wykorzystywane do komunikacji z klientem „stare” gniazdo może być równocześnie używane do dalszego nasłuchiwania Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 13/46 Wstęp Gniazda RMI Podsumowanie Gniazda w Javie Komunikacja strumieniowa (TCP) 1 http://download.java.net/jdk7/archive/b123/docs/api/java/net/ DatagramSocket.html 2 http://docs.oracle.com/javase/tutorial/networking/datagrams/ clientServer.html Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 14/46 Wstęp Gniazda RMI Podsumowanie Gniazda w Javie Komunikacja strumieniowa (TCP) Socket gniazdo komunikacyjne klienta i serwera 1 http://download.java.net/jdk7/archive/b123/docs/api/java/net/ DatagramSocket.html 2 http://docs.oracle.com/javase/tutorial/networking/datagrams/ clientServer.html Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 14/46 Wstęp Gniazda RMI Podsumowanie Gniazda w Javie Komunikacja strumieniowa (TCP) Socket gniazdo komunikacyjne klienta i serwera ServerSocket gniazdo do nasłuchiwania (dla serwera) 1 http://download.java.net/jdk7/archive/b123/docs/api/java/net/ DatagramSocket.html 2 http://docs.oracle.com/javase/tutorial/networking/datagrams/ clientServer.html Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 14/46 Wstęp Gniazda RMI Podsumowanie Gniazda w Javie Komunikacja strumieniowa (TCP) Socket gniazdo komunikacyjne klienta i serwera ServerSocket gniazdo do nasłuchiwania (dla serwera) Komunikacja datagramowa (UDP) 1 http://download.java.net/jdk7/archive/b123/docs/api/java/net/ DatagramSocket.html 2 http://docs.oracle.com/javase/tutorial/networking/datagrams/ clientServer.html Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 14/46 Wstęp Gniazda RMI Podsumowanie Gniazda w Javie Komunikacja strumieniowa (TCP) Socket gniazdo komunikacyjne klienta i serwera ServerSocket gniazdo do nasłuchiwania (dla serwera) Komunikacja datagramowa (UDP) DatagramSocket gniazdo komunikacyjne UDP 1 http://download.java.net/jdk7/archive/b123/docs/api/java/net/ DatagramSocket.html 2 http://docs.oracle.com/javase/tutorial/networking/datagrams/ clientServer.html Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 14/46 Wstęp Gniazda RMI Podsumowanie Gniazda w Javie Komunikacja strumieniowa (TCP) Socket gniazdo komunikacyjne klienta i serwera ServerSocket gniazdo do nasłuchiwania (dla serwera) Komunikacja datagramowa (UDP) DatagramSocket gniazdo komunikacyjne UDP Metody send i receive 1 http://download.java.net/jdk7/archive/b123/docs/api/java/net/ DatagramSocket.html 2 http://docs.oracle.com/javase/tutorial/networking/datagrams/ clientServer.html Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 14/46 Wstęp Gniazda RMI Podsumowanie Gniazda w Javie Komunikacja strumieniowa (TCP) Socket gniazdo komunikacyjne klienta i serwera ServerSocket gniazdo do nasłuchiwania (dla serwera) Komunikacja datagramowa (UDP) DatagramSocket gniazdo komunikacyjne UDP Metody send i receive DatagramPacket 1 http://download.java.net/jdk7/archive/b123/docs/api/java/net/ DatagramSocket.html 2 http://docs.oracle.com/javase/tutorial/networking/datagrams/ clientServer.html Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 14/46 Wstęp Gniazda RMI Podsumowanie Gniazda w Javie Komunikacja strumieniowa (TCP) Socket gniazdo komunikacyjne klienta i serwera ServerSocket gniazdo do nasłuchiwania (dla serwera) Komunikacja datagramowa (UDP) DatagramSocket gniazdo komunikacyjne UDP Metody send i receive DatagramPacket Dokumentacja1 1 http://download.java.net/jdk7/archive/b123/docs/api/java/net/ DatagramSocket.html 2 http://docs.oracle.com/javase/tutorial/networking/datagrams/ clientServer.html Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 14/46 Wstęp Gniazda RMI Podsumowanie Gniazda w Javie Komunikacja strumieniowa (TCP) Socket gniazdo komunikacyjne klienta i serwera ServerSocket gniazdo do nasłuchiwania (dla serwera) Komunikacja datagramowa (UDP) DatagramSocket gniazdo komunikacyjne UDP Metody send i receive DatagramPacket Dokumentacja1 Tutorial2 1 http://download.java.net/jdk7/archive/b123/docs/api/java/net/ DatagramSocket.html 2 http://docs.oracle.com/javase/tutorial/networking/datagrams/ clientServer.html Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 14/46 Wstęp Gniazda RMI Podsumowanie Gniazda w Javie Komunikacja strumieniowa (TCP) Socket gniazdo komunikacyjne klienta i serwera ServerSocket gniazdo do nasłuchiwania (dla serwera) Komunikacja datagramowa (UDP) DatagramSocket gniazdo komunikacyjne UDP Metody send i receive DatagramPacket Dokumentacja1 Tutorial2 MulticastSocket gniazdo komunikacyjne multicast 1 http://download.java.net/jdk7/archive/b123/docs/api/java/net/ DatagramSocket.html 2 http://docs.oracle.com/javase/tutorial/networking/datagrams/ clientServer.html Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 14/46 Wstęp Gniazda RMI Podsumowanie Użycie gniazda klienta 1 2 3 4 5 6 7 8 socket = new Socket ( adres , port ); PrintWriter out = new PrintWriter ( socket . g et Ou t pu tS tr e am () , true ); Buff eredRead er in = new B ufferedR eader ( new I n p u t S t r e a m R e a d e r ( socket . get InputStr eam ())); System . out . println ( in . readLine ()); out . println ( " Cze ś ć ! Uda ł o si ę ! " ); System . out . println ( in . readLine ()); Użycie gniazda klienta Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 15/46 Wstęp Gniazda RMI Podsumowanie Implementacja klienta 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import java . net .*; import java . io .*; public class Client { public static void main ( String args []) { String adres = args [0]; int port = Integer . parseInt ( args [1]); Socket socket = null ; try { socket = new Socket ( adres , port ); PrintWriter out = new PrintWriter ( socket . g et Ou t pu tS tr e am () , true ); Buff eredRead er in = new Bu fferedR eader ( new I n p u t S t r e a m R e a d e r ( socket . get InputStr eam ())); System . out . println ( in . readLine ()); out . println ( " Cze ś ć ! Uda ł o si ę ! " ); System . out . println ( in . readLine ()); } catch ( U n k n o w n H o s t E x c e p t i o n e ) { e . p r in tS ta c kT ra ce (); } catch ( IOException e ) { e . p r in tS ta c kT ra ce (); } finally { try { socket . close (); } catch ( IOException e ) { e . p ri n tS ta c kT ra ce (); } } } } Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 16/46 Wstęp Gniazda RMI Podsumowanie Użycie gniazda serwera 1 2 3 4 5 ssocket = new ServerSocket (1234); while ( true ) { Socket s = ssocket . accept (); serveClient ( s ); } Użycie gniazda serwera Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 17/46 Wstęp Gniazda RMI Podsumowanie Użycie gniazda serwera 1 2 3 4 5 ssocket = new ServerSocket (1234); while ( true ) { Socket s = ssocket . accept (); serveClient ( s ); } Użycie gniazda serwera 1 2 3 private static void serveClient ( Socket s ) { new Server ( s ). start (); } Obsługa klienta w nowym wątku Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 17/46 Wstęp Gniazda RMI Podsumowanie Implementacja serwera 1 2 3 4 5 6 7 import java . net .*; import java . io .*; public class Server extends Thread { private Socket csocket ; Server ( Socket csocket ) { super (); this . csocket = csocket ; } Implementacja serwera (początek) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 18/46 Wstęp Gniazda RMI Podsumowanie Implementacja serwera 1 2 3 4 5 6 7 8 9 PrintWriter out = new PrintWriter ( csocket . g e tO ut pu t St re am () , true ); Buff eredRead er in = new B ufferedR eader ( new I n p u t S t r e a m R e a d e r ( csocket . g etInputS tream ())); out . println ( " ==> Cze ś ć " + ip + " ! Uda ł o Ci si ę po ł ą czy ć ! " ); String line ; while (( line = in . readLine ()) != null ) { out . println ( " ==> Powiedzia ł e ś : " + line ); } Interakcja z klientem Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 18/46 Wstęp Gniazda RMI Podsumowanie Implementacja serwera 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public void run () { InetAddress ip = csocket . getI netAddre ss (); System . out . println ( " Po ł ą czenie z " + ip ); try { PrintWriter out = new PrintWriter ( csocket . g e tO ut pu t St re am () , true ); Buff eredRead er in = new B ufferedR eader ( new I n p u t S t r e a m R e a d e r ( csocket . g etInputS tream ())); out . println ( " ==> Cze ś ć " + ip + " ! Uda ł o Ci si ę po ł ą czy ć ! " ); String line ; while (( line = in . readLine ()) != null ) { out . println ( " ==> Powiedzia ł e ś : " + line ); } } catch ( IOException e ) { e . p ri nt St a ck Tr ac e (); } finally { try { csocket . close (); } catch ( IOException e ) { e . p ri n tS ta ck T ra ce (); } } System . out . println ( " Koniec po ł ą czenia z " + ip ); } Wojciech Rząsa, KIiA PRz Kompletna metoda run Programowanie rozproszone w języku Java 18/46 Wstęp Gniazda RMI Podsumowanie Gniazda i komunikacja Punkty końcowe komunikacji sieciowej Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 19/46 Wstęp Gniazda RMI Podsumowanie Gniazda i komunikacja Punkty końcowe komunikacji sieciowej Pozwalają przesyłać komunikaty pomiędzy procesami Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 19/46 Wstęp Gniazda RMI Podsumowanie Gniazda i komunikacja Punkty końcowe komunikacji sieciowej Pozwalają przesyłać komunikaty pomiędzy procesami Obsługują różne protokoły warstwy transportowej Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 19/46 Wstęp Gniazda RMI Podsumowanie Gniazda i komunikacja Punkty końcowe komunikacji sieciowej Pozwalają przesyłać komunikaty pomiędzy procesami Obsługują różne protokoły warstwy transportowej Interfejs obiektowy w Javie Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 19/46 Wstęp Gniazda RMI Podsumowanie Gniazda i komunikacja Punkty końcowe komunikacji sieciowej Pozwalają przesyłać komunikaty pomiędzy procesami Obsługują różne protokoły warstwy transportowej Interfejs obiektowy w Javie Nie zapomnieć o zamykaniu gniazd i strumieni (wycieki pamięci)! Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 19/46 Wstęp Gniazda RMI Podsumowanie Gniazda i komunikacja Punkty końcowe komunikacji sieciowej Pozwalają przesyłać komunikaty pomiędzy procesami Obsługują różne protokoły warstwy transportowej Interfejs obiektowy w Javie Nie zapomnieć o zamykaniu gniazd i strumieni (wycieki pamięci)! Aplikacja rozproszona wymaga zdefiniowania protokołu komunikacyjnego Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 19/46 Wstęp Gniazda RMI Podsumowanie Gniazda i komunikacja Punkty końcowe komunikacji sieciowej Pozwalają przesyłać komunikaty pomiędzy procesami Obsługują różne protokoły warstwy transportowej Interfejs obiektowy w Javie Nie zapomnieć o zamykaniu gniazd i strumieni (wycieki pamięci)! Aplikacja rozproszona wymaga zdefiniowania protokołu komunikacyjnego Następstwa wymienianych komunikatów Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 19/46 Wstęp Gniazda RMI Podsumowanie Gniazda i komunikacja Punkty końcowe komunikacji sieciowej Pozwalają przesyłać komunikaty pomiędzy procesami Obsługują różne protokoły warstwy transportowej Interfejs obiektowy w Javie Nie zapomnieć o zamykaniu gniazd i strumieni (wycieki pamięci)! Aplikacja rozproszona wymaga zdefiniowania protokołu komunikacyjnego Następstwa wymienianych komunikatów Znaczenia wymienianych komunikatów Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 19/46 Wstęp Gniazda RMI Podsumowanie Gniazda i komunikacja Punkty końcowe komunikacji sieciowej Pozwalają przesyłać komunikaty pomiędzy procesami Obsługują różne protokoły warstwy transportowej Interfejs obiektowy w Javie Nie zapomnieć o zamykaniu gniazd i strumieni (wycieki pamięci)! Aplikacja rozproszona wymaga zdefiniowania protokołu komunikacyjnego Następstwa wymienianych komunikatów Znaczenia wymienianych komunikatów Protokoły tekstowe i binarne Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 19/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Plan 1 Wstęp 2 Komunikacja sieciowa 3 Zdalne wywołanie metod (RMI) Wstęp Interfejsy Zdalne klasy Działanie RMI Aplikacja RMI 4 Podsumowanie Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 20/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Zdalne wywołanie metod (RMI) Remote Method Invocation Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 21/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Zdalne wywołanie metod (RMI) Remote Method Invocation Sposób tworzenia aplikacji rozproszonych Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 21/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Zdalne wywołanie metod (RMI) Remote Method Invocation Sposób tworzenia aplikacji rozproszonych Wyższy poziom niż gniazda Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 21/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Zdalne wywołanie metod (RMI) Remote Method Invocation Sposób tworzenia aplikacji rozproszonych Wyższy poziom niż gniazda Bazuje na gniazdach Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 21/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Zdalne wywołanie metod (RMI) Remote Method Invocation Sposób tworzenia aplikacji rozproszonych Wyższy poziom niż gniazda Bazuje na gniazdach Koncepcja oparta na RPC (Remote Procedure Call) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 21/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Idea RMI Wywoływanie metod Na obiektach zdalnych Na innej maszynie wirtualnej Na innej maszynie fizycznej Implementacja w Javie Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 22/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Wywołanie metody na zdalnym obiekcie Zlokalizowanie obiektu – rejestr RMI Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 23/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Wywołanie metody na zdalnym obiekcie Zlokalizowanie obiektu – rejestr RMI Komunikacja z obiektem Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 23/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Wywołanie metody na zdalnym obiekcie Zlokalizowanie obiektu – rejestr RMI Komunikacja z obiektem Zdalne załadowanie definicji klasy dla obiektu Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 23/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Zlokalizowanie obiektu Rejestr rmiregistry Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 24/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Zlokalizowanie obiektu Rejestr rmiregistry Obiekty rejestrują zdalne interfejsy w rejestrze Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 24/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Zlokalizowanie obiektu Rejestr rmiregistry Obiekty rejestrują zdalne interfejsy w rejestrze Pobranie referencji z rejestru, wywołanie metody Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 24/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Zlokalizowanie obiektu Rejestr rmiregistry Obiekty rejestrują zdalne interfejsy w rejestrze Pobranie referencji z rejestru, wywołanie metody Użycie zdalnej referencji z poprzedniego wywołania Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 24/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Komunikacja z obiektem Realizowana przez RMI Niewidoczna dla użytkownika Ukryta za zwykłym wywołaniem metody na obiekcie Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 25/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Interfejsy Wywołujący zdalną metodę obiektu nie musi znać jego implementacji. . . Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 26/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Interfejsy Wywołujący zdalną metodę obiektu nie musi znać jego implementacji. . . . . . ale musi znać jego interfejs Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 26/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Interfejsy Wywołujący zdalną metodę obiektu nie musi znać jego implementacji. . . . . . ale musi znać jego interfejs Zdalne wywołanie wymaga znajomości zdalnego interfejsu Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 26/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Interfejsy Wywołujący zdalną metodę obiektu nie musi znać jego implementacji. . . . . . ale musi znać jego interfejs Zdalne wywołanie wymaga znajomości zdalnego interfejsu Zdalne interfejsy – ustalone i współdzielone przez obie strony Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 26/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Zdalny interfejs w Javie Interfejs Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 27/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Zdalny interfejs w Javie Interfejs Dziedziczący po java.rmi.Remote Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 27/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Zdalny interfejs w Javie Interfejs Dziedziczący po java.rmi.Remote Każda metoda może wygenerować java.rmi.RemoteException Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 27/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Implementacja zdalnych metod Klasa Javy Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 28/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Implementacja zdalnych metod Klasa Javy Implementująca jeden lub więcej zdalny interfejs Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 28/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Implementacja zdalnych metod Klasa Javy Implementująca jeden lub więcej zdalny interfejs Może implementować wiele innych metod Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 28/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Obiekty zdalne i lokalne w wywołaniach Parametrem zdalnej metody może być obiekt Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 29/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Obiekty zdalne i lokalne w wywołaniach Parametrem zdalnej metody może być obiekt Zdalna metoda może zwracać obiekt Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 29/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Obiekty zdalne i lokalne w wywołaniach Parametrem zdalnej metody może być obiekt Zdalna metoda może zwracać obiekt Do kompilacji wystarczy znać interfejs tego obiektu Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 29/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Obiekty zdalne i lokalne w wywołaniach Parametrem zdalnej metody może być obiekt Zdalna metoda może zwracać obiekt Do kompilacji wystarczy znać interfejs tego obiektu Obiekt zdalny Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 29/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Obiekty zdalne i lokalne w wywołaniach Parametrem zdalnej metody może być obiekt Zdalna metoda może zwracać obiekt Do kompilacji wystarczy znać interfejs tego obiektu Obiekt zdalny przekazany przez zdalną referencję Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 29/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Obiekty zdalne i lokalne w wywołaniach Parametrem zdalnej metody może być obiekt Zdalna metoda może zwracać obiekt Do kompilacji wystarczy znać interfejs tego obiektu Obiekt zdalny przekazany przez zdalną referencję istnieje jedna kopia obiektu Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 29/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Obiekty zdalne i lokalne w wywołaniach Parametrem zdalnej metody może być obiekt Zdalna metoda może zwracać obiekt Do kompilacji wystarczy znać interfejs tego obiektu Obiekt zdalny przekazany przez zdalną referencję istnieje jedna kopia obiektu Obiekt lokalny Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 29/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Obiekty zdalne i lokalne w wywołaniach Parametrem zdalnej metody może być obiekt Zdalna metoda może zwracać obiekt Do kompilacji wystarczy znać interfejs tego obiektu Obiekt zdalny przekazany przez zdalną referencję istnieje jedna kopia obiektu Obiekt lokalny serializowany, przesyłany i deserializowany Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 29/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Obiekty zdalne i lokalne w wywołaniach Parametrem zdalnej metody może być obiekt Zdalna metoda może zwracać obiekt Do kompilacji wystarczy znać interfejs tego obiektu Obiekt zdalny przekazany przez zdalną referencję istnieje jedna kopia obiektu Obiekt lokalny serializowany, przesyłany i deserializowany tworzona zdalna kopia obiektu Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 29/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Obiekty zdalne i lokalne w wywołaniach Parametrem zdalnej metody może być obiekt Zdalna metoda może zwracać obiekt Do kompilacji wystarczy znać interfejs tego obiektu Obiekt zdalny przekazany przez zdalną referencję istnieje jedna kopia obiektu Obiekt lokalny serializowany, przesyłany i deserializowany tworzona zdalna kopia obiektu do użycia obiektu konieczna jest definicja jego klasy! Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 29/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Obiekty zdalne i lokalne w wywołaniach Parametrem zdalnej metody może być obiekt Zdalna metoda może zwracać obiekt Do kompilacji wystarczy znać interfejs tego obiektu Obiekt zdalny przekazany przez zdalną referencję istnieje jedna kopia obiektu Obiekt lokalny serializowany, przesyłany i deserializowany tworzona zdalna kopia obiektu do użycia obiektu konieczna jest definicja jego klasy! klasa musi implementować java.io.Serializable Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 29/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Obiekty zdalne i lokalne w wywołaniach Parametrem zdalnej metody może być obiekt Zdalna metoda może zwracać obiekt Do kompilacji wystarczy znać interfejs tego obiektu Obiekt zdalny przekazany przez zdalną referencję istnieje jedna kopia obiektu Obiekt lokalny serializowany, przesyłany i deserializowany tworzona zdalna kopia obiektu do użycia obiektu konieczna jest definicja jego klasy! klasa musi implementować java.io.Serializable W czasie działania konieczne jest załadowanie definicji nieznanej klasy! Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 29/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Obiekty zdalne i lokalne w wywołaniach Parametrem zdalnej metody może być obiekt Zdalna metoda może zwracać obiekt Do kompilacji wystarczy znać interfejs tego obiektu Obiekt zdalny przekazany przez zdalną referencję istnieje jedna kopia obiektu Obiekt lokalny serializowany, przesyłany i deserializowany tworzona zdalna kopia obiektu do użycia obiektu konieczna jest definicja jego klasy! klasa musi implementować java.io.Serializable W czasie działania konieczne jest załadowanie definicji nieznanej klasy! Dynamiczne ładowanie konieczne zarówno przez klienta jak i serwer Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 29/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Dynamiczne ładowanie kodu klas Z określonego miejsca na dysku (wymaga wielu kopii plików class) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 30/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Dynamiczne ładowanie kodu klas Z określonego miejsca na dysku (wymaga wielu kopii plików class) RMI potrafi pobrać potrzebne klasy np. przez HTTP (tzw. codebase) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 30/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Dynamiczne ładowanie kodu klas Z określonego miejsca na dysku (wymaga wielu kopii plików class) RMI potrafi pobrać potrzebne klasy np. przez HTTP (tzw. codebase) Poza rejestrem zdalnych metod konieczne repozytorium z implementacją Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 30/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI rmiregistry i współdzielone interfejsy rmiregistry porzebuje plików class dla interfejsów współdzielonych Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 31/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI rmiregistry i współdzielone interfejsy rmiregistry porzebuje plików class dla interfejsów współdzielonych Mogą być dostępne lokalnie w CLASSPATH Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 31/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI rmiregistry i współdzielone interfejsy rmiregistry porzebuje plików class dla interfejsów współdzielonych Mogą być dostępne lokalnie w CLASSPATH Mogą być ładowane dynamicznie (z codebase serwera) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 31/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Działanie RMI 1 rmiregistry [http://docs.oracle.com/javase/tutorial/rmi/overview.html] Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 32/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Działanie RMI 1 2 rmiregistry codebase serwera na serwerze HTTP [http://docs.oracle.com/javase/tutorial/rmi/overview.html] Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 32/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Działanie RMI 1 2 3 rmiregistry codebase serwera na serwerze HTTP Serwer [http://docs.oracle.com/javase/tutorial/rmi/overview.html] Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 32/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Działanie RMI 1 2 3 4 rmiregistry codebase serwera na serwerze HTTP Serwer codebase klienta na serwerze HTTP [http://docs.oracle.com/javase/tutorial/rmi/overview.html] Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 32/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Działanie RMI 1 2 3 4 5 rmiregistry codebase serwera na serwerze HTTP Serwer codebase klienta na serwerze HTTP Klient [http://docs.oracle.com/javase/tutorial/rmi/overview.html] Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 32/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Komunikacja ze zdalnym obiektem Serwer rejestruje tzw. stub w rmiregistry Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 33/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Komunikacja ze zdalnym obiektem Serwer rejestruje tzw. stub w rmiregistry stub implementuje zdalny interfejs Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 33/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Komunikacja ze zdalnym obiektem Serwer rejestruje tzw. stub w rmiregistry stub implementuje zdalny interfejs rmiregistry zwraca stub do klienta Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 33/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Komunikacja ze zdalnym obiektem Serwer rejestruje tzw. stub w rmiregistry stub implementuje zdalny interfejs rmiregistry zwraca stub do klienta Wywołania metod stuba są przekazywane do zdalnego obiektu Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 33/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Komunikacja ze zdalnym obiektem Serwer rejestruje tzw. stub w rmiregistry stub implementuje zdalny interfejs rmiregistry zwraca stub do klienta Wywołania metod stuba są przekazywane do zdalnego obiektu Wyniki metod zdalnego obiektu są przekazywane do stuba i zwracane do klienta Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 33/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Komunikacja ze zdalnym obiektem Serwer rejestruje tzw. stub w rmiregistry stub implementuje zdalny interfejs rmiregistry zwraca stub do klienta Wywołania metod stuba są przekazywane do zdalnego obiektu Wyniki metod zdalnego obiektu są przekazywane do stuba i zwracane do klienta Komunikacja ukryta przez klientem Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 33/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Bezpieczeństwo Zdalnie załadowany kod może być niebezpieczny Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 34/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Bezpieczeństwo Zdalnie załadowany kod może być niebezpieczny Bezpieczeństwo zapewnia SecurityManager Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 34/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Bezpieczeństwo Zdalnie załadowany kod może być niebezpieczny Bezpieczeństwo zapewnia SecurityManager Wymagany do załadowania zdalnego kodu Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 34/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Bezpieczeństwo Zdalnie załadowany kod może być niebezpieczny Bezpieczeństwo zapewnia SecurityManager Wymagany do załadowania zdalnego kodu Konfigurowany z pliku Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 34/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Bezpieczeństwo Zdalnie załadowany kod może być niebezpieczny Bezpieczeństwo zapewnia SecurityManager Wymagany do załadowania zdalnego kodu Konfigurowany z pliku Ogranicza działania aplikacji Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 34/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Bezpieczeństwo Zdalnie załadowany kod może być niebezpieczny Bezpieczeństwo zapewnia SecurityManager Wymagany do załadowania zdalnego kodu Konfigurowany z pliku Ogranicza działania aplikacji Uruchamiając klienta i serwer trzeba podać ścieżkę do policy file Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 34/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Tworzenie aplikacji RMI Uzgodnienie zdalnych interfejsów Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 35/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Tworzenie aplikacji RMI Uzgodnienie zdalnych interfejsów Implementacja zdalnych interfejsów (serwer) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 35/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Tworzenie aplikacji RMI Uzgodnienie zdalnych interfejsów Implementacja zdalnych interfejsów (serwer) Implementacja zdalnych wywołań (klient) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 35/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Uruchamianie aplikacji RMI Kompilacja Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 36/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Uruchamianie aplikacji RMI Kompilacja Udostępnienie w sieci definicji klas klienta Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 36/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Uruchamianie aplikacji RMI Kompilacja Udostępnienie w sieci definicji klas klienta Udostępnienie w sieci definicji klas serwera Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 36/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Uruchamianie aplikacji RMI Kompilacja Udostępnienie w sieci definicji klas klienta Udostępnienie w sieci definicji klas serwera Start rmiregistry Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 36/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Uruchamianie aplikacji RMI Kompilacja Udostępnienie w sieci definicji klas klienta Udostępnienie w sieci definicji klas serwera Start rmiregistry Start serwera (rejestruje zdalne obiekty w rmiregistry) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 36/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Uruchamianie aplikacji RMI Kompilacja Udostępnienie w sieci definicji klas klienta Udostępnienie w sieci definicji klas serwera Start rmiregistry Start serwera (rejestruje zdalne obiekty w rmiregistry) Start klienta (klientów) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 36/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Przykładowa aplikacja Zgłaszanie obecności osoby Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 37/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Przykładowa aplikacja Zgłaszanie obecności osoby Klient tworzy nowy obiekt Osoba wraz z danymi Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 37/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Przykładowa aplikacja Zgłaszanie obecności osoby Klient tworzy nowy obiekt Osoba wraz z danymi Klient wywołuje zdalną metodę reportPresenceOf podając obiekt klasy Osoba Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 37/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Przykładowa aplikacja Zgłaszanie obecności osoby Klient tworzy nowy obiekt Osoba wraz z danymi Klient wywołuje zdalną metodę reportPresenceOf podając obiekt klasy Osoba Serwer zapamiętuje osobę na podstawie danych otrzymanych od klienta Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 37/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Współdzielone części kodu Przy programowaniu Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 38/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Współdzielone części kodu Przy programowaniu Zdalny interfejs zgłaszania obeności (RemotePresenceList) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 38/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Współdzielone części kodu Przy programowaniu Zdalny interfejs zgłaszania obeności (RemotePresenceList) Interfejs klasy Osoba (OsobaInterface) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 38/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Współdzielone części kodu Przy programowaniu Zdalny interfejs zgłaszania obeności (RemotePresenceList) Interfejs klasy Osoba (OsobaInterface) Tylko interfejsy! Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 38/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Współdzielone części kodu Przy programowaniu Zdalny interfejs zgłaszania obeności (RemotePresenceList) Interfejs klasy Osoba (OsobaInterface) Tylko interfejsy! Przy uruchomieniu Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 38/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Współdzielone części kodu Przy programowaniu Zdalny interfejs zgłaszania obeności (RemotePresenceList) Interfejs klasy Osoba (OsobaInterface) Tylko interfejsy! Przy uruchomieniu Definicja klasy Osoba (skompilowana) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 38/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Współdzielone interfejsy 1 2 3 4 5 6 7 8 package shared ; public interface R e m o t e P r e s e n c e L i s t extends java . rmi . Remote { public boolean r e p o r t P r es e n c e O f ( OsobaIn terface o ) throws java . rmi . R em o te Ex ce p ti on ; } Wojciech Rząsa, KIiA PRz Interfejs zdalnej rejestracji Programowanie rozproszone w języku Java 39/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Współdzielone interfejsy 1 2 3 4 5 6 7 8 package shared ; public interface R e m o t e P r e s e n c e L i s t extends java . rmi . Remote { public boolean r e p o r t P r es e n c e O f ( OsobaIn terface o ) throws java . rmi . R em o te Ex ce p ti on ; } Interfejs zdalnej rejestracji 1 2 3 4 5 6 package shared ; public interface O sobaInte rface { public String getFirstName (); public String getLastName (); public int getI ndexNum ber (); } Wojciech Rząsa, KIiA PRz Interfejs osoby Programowanie rozproszone w języku Java 39/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Implementacja zdalnego interfejsu (serwer) 1 2 3 4 5 6 7 8 9 10 package server ; import import import import java . rmi . R em o te Ex ce p ti on ; java . rmi . registry . Locate Registry ; java . rmi . registry . Registry ; java . rmi . server . U n i c a s t R e m o t e O b j e c t ; import shared .*; public class PresenceList implements R e m o t e P r e s e n c e L i s t { Początek implementacji zdalnego interfejsu Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 40/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Implementacja zdalnego interfejsu (serwer) 12 13 14 15 16 17 18 19 public boolean r e p o r t P r es e n c e O f ( OsobaIn terface o ) { System . out . print ( " Zapisano obecno ś ć osoby : " ); System . out . print ( o . getFirstName () + " " ); System . out . print ( o . getLastName () + " " ); System . out . println ( " indeks : " + o . get IndexNu mber ()); return true ; } Implementacja metody wywoływanej zdalnie Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 40/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Implementacja zdalnego interfejsu (serwer) 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 public static void main ( String args []) { if ( System . g e t S e c u r i t y M a n a g e r () == null ) { System . s e t S e c u r i t y M a n a g e r ( new S ec u ri ty Ma n ag er ()); } try { PresenceList list = new PresenceList (); R e m o t e P r e s e n c e L i s t remote_list = ( R e m o t e P r e s e n c e L i s t ) U n i c a s t R e m o t e O b j e c t . exportObject ( list , 0); Registry registry = Locat eRegistr y . getRegistry (); registry . rebind ( " R e m o t e P r e s e n c e L i s t " , remote_list ); System . out . println ( " Remote presence list bound " ); } catch ( Re mo te E xc ep ti o n e ) { e . p ri nt St a ck Tr ac e (); } } Utworzenie obiektu i rejestracja zdalnej metody Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 40/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Wywołanie zdalnej metody (klient) 1 2 3 4 5 6 7 8 9 10 11 package client ; import import import import java . rmi . R em o te Ex ce p ti on ; java . rmi . N o t B o u n d E x c e p t i o n ; java . rmi . registry . Locate Registry ; java . rmi . registry . Registry ; import shared .*; import client . shared . Student ; public class ReportStudent { Początek implementacji części klienckiej Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 41/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Wywołanie zdalnej metody (klient) 13 14 15 16 17 18 public static void main ( String args []){ if ( System . g e t S e c u r i t y M a n a g e r () == null ) { System . s e t S e c u r i t y M a n a g e r ( new S ec u ri ty Ma n ag er ()); } Student ja = new Student ( " Jan " , " Kowalski " , 1234); Operacje wstępne Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 41/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Wywołanie zdalnej metody (klient) 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 try { Registry registry = Locat eRegistr y . getRegistry ( args [0]); R e m o t e P r e s e n c e L i s t list = ( R e m o t e P r e s e n c e L i s t ) registry . lookup ( " R e m o t e P r e s e n c e L i s t " ); boolean result = list . r e p or t P r e s e n c e O f ( ja ); if ( result ) { System . out . println ( " Obecno ś ć zarejest rowano poprawnie " ); } else { System . out . println ( " System odm ó wi ł przyj ę cia zg ł oszenia " ); } } catch ( Re m ot eE x ce pt io n e ) { e . pr in t St ac kT r ac e (); } catch ( N o t B o u n d E x c e p t i o n e ) { e . p ri nt S ta ck Tr a ce (); } } Wywołanie zdalnej metody Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 41/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Wywołanie zdalnej metody (klient) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package client . shared ; import java . io . Serializable ; import shared .*; public class Student implements OsobaInterface , Serializable { private String fname , lname ; private int index ; public Student ( String fname , String lname , int index ) { this . fname = fname ; this . lname = lname ; this . index = index ; } public String getFirstName () { return fname ; } public String getLastName () { return lname ; } public int getI ndexNum ber () { return index ; } } Wojciech Rząsa, KIiA PRz Klasa przekazywana do zdalnej metody Programowanie rozproszone w języku Java 41/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Przygotowanie do uruchomienia Kompilacja kodu współdzielonego, serwera i klienta Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 42/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Przygotowanie do uruchomienia Kompilacja kodu współdzielonego, serwera i klienta Utworzenie archiwów jar skompilowanego kodu: Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 42/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Przygotowanie do uruchomienia Kompilacja kodu współdzielonego, serwera i klienta Utworzenie archiwów jar skompilowanego kodu: shared.jar współdzielone interfejsy (serwer) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 42/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Przygotowanie do uruchomienia Kompilacja kodu współdzielonego, serwera i klienta Utworzenie archiwów jar skompilowanego kodu: shared.jar współdzielone interfejsy (serwer) client shared.jar klasy klient potrzebne serwerowi (klient) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 42/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Przygotowanie do uruchomienia Kompilacja kodu współdzielonego, serwera i klienta Utworzenie archiwów jar skompilowanego kodu: shared.jar współdzielone interfejsy (serwer) client shared.jar klasy klient potrzebne serwerowi (klient) server shared.jar klasy klient potrzebne klientowi (serwer) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 42/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Przygotowanie do uruchomienia Kompilacja kodu współdzielonego, serwera i klienta Utworzenie archiwów jar skompilowanego kodu: shared.jar współdzielone interfejsy (serwer) client shared.jar klasy klient potrzebne serwerowi (klient) server shared.jar klasy klient potrzebne klientowi (serwer) Umieszczenie plików jar na serwerach www Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 42/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Przygotowanie do uruchomienia Kompilacja kodu współdzielonego, serwera i klienta Utworzenie archiwów jar skompilowanego kodu: shared.jar współdzielone interfejsy (serwer) client shared.jar klasy klient potrzebne serwerowi (klient) server shared.jar klasy klient potrzebne klientowi (serwer) Umieszczenie plików jar na serwerach www Konfiguracja SecurityManagera – client.policy i server.policy 1 2 3 grant codeBase " file : $ { user . home }/ sciezka / - " { permission java . security . AllPermission ; }; Przykładowa definicja polityki bezpieczeństwa Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 42/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Uruchomienie aplikacji 1 Uruchomenie rmiregistry (javase >=7) rmiregistry -J - Djava . rmi . server . u s eC od eb a se On ly = false Uruchomienie rmiregistry http://docs.oracle.com/javase/7/docs/technotes/ guides/rmi/enhancements-7.html This change of default value may cause RMI-based applications to break unexpectedly. Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 43/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Uruchomienie aplikacji 1 Uruchomenie rmiregistry (javase >=7) rmiregistry -J - Djava . rmi . server . u s eC od eb a se On ly = false 2 Uruchomienie rmiregistry Uruchomienie serwera (javase >=7) java - Djava . security . policy = server . policy \ - Djava . rmi . server . codebase = http :// s1 / shared . jar \ - Djava . rmi . server . us eC od e ba se On l y = false \ server / PresenceList Uruchomienie serwera Może być potrzebne też java.rmi.server.hostname=IP Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 43/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI Uruchomienie aplikacji 1 Uruchomenie rmiregistry (javase >=7) rmiregistry -J - Djava . rmi . server . u s eC od eb a se On ly = false 2 Uruchomienie rmiregistry Uruchomienie serwera (javase >=7) java - Djava . security . policy = server . policy \ - Djava . rmi . server . codebase = http :// s1 / shared . jar \ - Djava . rmi . server . us eC od e ba se On l y = false \ server / PresenceList 3 Uruchomienie serwera Uruchomienie klienta (javase >=7) java - Djava . security . policy = client . policy \ - Djava . rmi . server . codebase = http :// s2 / client_shared . jar \ client / ReportStudent a d r e s _ s e r w e r a _ z _ r m i r e g i s t r y Wojciech Rząsa, KIiA PRz Uruchomienie klienta Programowanie rozproszone w języku Java 43/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI RMI – podsumowanie Proste wywołanie metody na zdalnym obiekcie Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 44/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI RMI – podsumowanie Proste wywołanie metody na zdalnym obiekcie Wymaga sporo przygotowań Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 44/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI RMI – podsumowanie Proste wywołanie metody na zdalnym obiekcie Wymaga sporo przygotowań Kwestia dostępności kodu Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 44/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI RMI – podsumowanie Proste wywołanie metody na zdalnym obiekcie Wymaga sporo przygotowań Kwestia dostępności kodu Bezpieczeństwo Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 44/46 Wstęp Gniazda RMI Podsumowanie Wstęp Interfejsy Zdalne klasy Działanie Aplikacja RMI RMI – podsumowanie Proste wywołanie metody na zdalnym obiekcie Wymaga sporo przygotowań Kwestia dostępności kodu Bezpieczeństwo Wysokopoziomowy model programowania rozproszonego Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 44/46 Wstęp Gniazda RMI Podsumowanie Plan 1 Wstęp 2 Komunikacja sieciowa 3 Zdalne wywołanie metod (RMI) 4 Podsumowanie Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 45/46 Wstęp Gniazda RMI Podsumowanie Programowanie rozproszone w Javie (omówione aspekty) Obsługa gniazd, wymiana danych Strumieniowych (TCP) Datagramowych (UDP), multicast Brak gniazd „surowych” (raw) Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 46/46 Wstęp Gniazda RMI Podsumowanie Programowanie rozproszone w Javie (omówione aspekty) Obsługa gniazd, wymiana danych Strumieniowych (TCP) Datagramowych (UDP), multicast Brak gniazd „surowych” (raw) Remote Method Invocation (RMI) Model wysokopoziomowy Narzut „organizacyjny” Gotowy protokół komunikacyjny Rozproszone programowanie obiektowe Wojciech Rząsa, KIiA PRz Programowanie rozproszone w języku Java 46/46