Java programowanie w sieci. java.net RMI



Podobne dokumenty
Przykłady interfejsu TCP i UDP w Javie

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

Programowanie w języku Java

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ć

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

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

Podejście obiektowe do budowy systemów rozproszonych

Aplikacje RMI

Programowanie rozproszone w języku Java

Remote Method Invocation 17 listopada 2010

Wywoływanie metod zdalnych

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Wywoływanie metod zdalnych

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

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

Aplikacja wielowątkowa prosty komunikator

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

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

Aplikacje RMI Lab4

Aplikacja wielow tkowa prosty komunikator

Systemy Rozproszone - Ćwiczenie 6

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

Programowanie aplikacji w architekturze Klient-Serwer - UDP

JAVA I SIECI. MATERIAŁY:

Programowanie współbieżne i rozproszone

Java programowanie sieciowe

Komunikacja z użyciem gniazd aplikacje klient-serwer

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

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

Adresy URL. Zaawansowane technologie Javy 2019

Tworzenia aplikacji rozproszonej RMI

Obiekty sieciowe - gniazda Komputery w sieci Internet komunikują się ze sobą poprzez:

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

Remote Method Invocation

Platformy Programistyczne Zagadnienia sieciowe i wątki

Tworzenie i wykorzystanie usług

14. Komunikacja rozproszona gniazdka, RMI

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

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

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

Java a dost p do Internetu.

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

Komponenty sterowane komunikatami

Bezpieczne uruchamianie apletów wg

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

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

Serwer współbieżny połączeniowy

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

Wprowadzenie do technologii Web Services: SOAP, WSDL i UDDI

Programowanie sieciowe

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

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

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

STRUMIENIE DANYCH, SERIALIZACJA OBIEKTÓW

Podstawy i języki programowania

Ćwiczenie 9 - Zaawansowane metody programowania w sieci komputerowej

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

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

package pakieta; import pakietb.b; package pakietb; public class B { B(){} public class A { private B b; A(B b) { this.b = b; } }

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

Programowanie obiektowe

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

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

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

Programowanie obiektowe

Java. Programowanie Obiektowe Mateusz Cicheński

Zaawansowane aplikacje WWW - laboratorium

RESTful Android. Na co zwrócić uwagę przy tworzeniu aplikacji klienckich REST na Androidzie

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

Networking. Zaawansowane technologie Javy 2019

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

Java, bazy danych i SSL

Aplikacje internetowe i rozproszone - laboratorium

Programowanie obiektowe

Tworzenie aplikacji rozproszonej w Sun RPC

KLASY, INTERFEJSY, ITP

Gniazda komunikacji sieciowej w środowisku Java

Wybrane działy Informatyki Stosowanej

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

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

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

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

SOAP. Autor: Piotr Sobczak

Programowanie obiektowe zastosowanie języka Java SE

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

KOMUNIKACJA MIĘDZYPROCESOWA O B S Ł U G A WEJŚCIA/WYJŚCIA

Technologie internetowe laboratorium nr 4. Instalacja i uruchomienie usługi sieciowej w serwerze Tomcat/AXIS

Programowanie obiektowe

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Architektury systemów rozproszonych LABORATORIUM. Ćwiczenie 1

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Gniazda BSD implementacja w C#

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

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

1. Co można powiedzieć o poniższym kodzie? public class A { void m(int a) { } int m(string s) { return Integer.parseInt(s); }

K O M U N I K A C J A MIĘDZYPROCESOWA O B S Ł U G A WEJŚCIA/WYJŚCIA

Transkrypt:

Java programowanie w sieci java.net RMI

Programowanie sieciowe OSI WARSTWA APLIKACJI (7) WARSTWA PREZENTACJI(6) WARSTWA SESJI (5) WARSTWA TRANSPORTU (4) DoD Warstwa aplikacji (HTTP) Transport (gniazdka) Java Warstwa aplikacji (np. HTTP) Transport (TCP, UDP) WARSTWA SIECIOWA (3) Sieć (datagramy, adresy IP) Sieć (IP) WARSTWA ŁĄCZA DANYCH (2) WARSTWA FIZYCZNA (1) Dostęp do sieci Połączenie (Sterowniki urządzeń)

java.net Klasy/interfejsy do adresowania IP ustanawiania połączeń TCP wysyłania i otrzymywania datagramów via UDP lokalizacji i identyfikacji zasobów sieciowych identyfikacji autoryzacji

java.net -- adresowanie IP Klasy do adresowania IP Ipv4 (32b) i Ipv6 (128b) public class MyDNS { public static void main(string[] args) throws Exception { java.net.inetaddress a = java.net.inetaddress.getbyname(args[0]); System.out.println(a);

java.net -- adresowanie gniazdek Klasy do adresowania gniazdek SocketAddress (abstrakcyjna) InetSocketAddress SocketAddress= new InetSocketAddress( localhost, 80 ); SocketAddress= new InetSocketAddress( volt, 8080 );

Gniazdka (1) Serwer Serwer Port Port Port Żądanie połączenia Klient Klient Gniazdko (socket) to punkt końcowy połączenia pomiędzy dwoma programami działającymi w sieci. Gniazdko jest przypięte do określonego portu.

Gniazdka (2)

Strona klienta Socket socket = null; PrintWriter out = null; BufferedReader in = null; try { socket = new Socket( args[0], Integer.parseInt( args[1] )); out = new PrintWriter(socket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader( socket.getinputstream())); catch (UnknownHostException e) { System.err.println("Don't know about host: " + args[0] ); System.exit(1); catch (IOException e) { System.err.println("Couldn't get I/O for " + "the connection to: " + args[0] + " port " + args[1] ); System.exit(1); catch ( NumberFormatException e ) { System.err.println( "Port no. must be an integer number - got " + args[1] ); System.exit(1);

Strona serwera ServerSocket serversocket = null; try { serversocket = new ServerSocket( Integer.parseInt(args[0])); catch (IOException e) { System.err.println("Could not listen on port: "+args[0]); System.exit(1); catch(numberformatexception e ) { System.err.println( "Port number! ); System.exit(1); Socket clientsocket = null; try { clientsocket = serversocket.accept(); catch (IOException e) { System.err.println("Accept failed."); System.exit(1); PrintWriter out = new PrintWriter( clientsocket.getoutputstream(), true); BufferedReader in = new BufferedReader( new InputStreamReader( clientsocket.getinputstream()));

Ćwiczenie: połączenie TCP Serwer http://www.iem.pw.edu.pl/~jstar/myserver.java Klient http://www.iem.pw.edu.pl/~jstar/myclient.java

Datagramy UDP (1) Tworzymy gniazdko Tworzymy pakiet Wysyłamy Możemy odebrać odpowiedź

Datagramy UDP (2) // Tworzymy gniazdko DatagramSocket socket = new DatagramSocket(); // Szykujemy pakiet byte[] buf = new byte[256]; InetAddress address = InetAddress.getByName(args[0]); DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4445); // Wysyłamy go socket.send(packet); // Odbieramy odpowiedź packet = new DatagramPacket(buf, buf.length); socket.receive(packet); // Wyciągamy z niej dane String received = new String(packet.getData());

Datagramy UDP (3) socket = new DatagramSocket(4445);... public void run() { while (cośtam) { try { byte[] buf = new byte[256]; // Przyjmij żądanie DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); // Adres nadawcy InetAddress address = packet.getaddress(); int port = packet.getport(); // Odpowiedz buf= response( buf ); packet = new DatagramPacket(buf, buf.length, address, port); socket.send(packet);

Ćwiczenie: datagramy UDP Serwer http://www.iem.pw.edu.pl/~jstar/quotes.txt http://www.iem.pw.edu.pl/~jstar/quteserver.java http://www.iem.pw.edu.pl/~jstar/quoteserverthread.java Klient http://www.iem.pw.edu.pl/~jstar/quoteclient.java

Dostęp do zasobów sieci URI URL URLClassLoader URLConnection URLStreamHandler HttpURLConnection JarURLConnection

Połączenie URL (1)

Połączenie URL (2) import java.net.*; import java.io.*; public class URLConnectionReader { public static void main(string[] args) throws Exception { URL goo = new URL("http://www.google.pl/"); URLConnection gc = goo.openconnection(); BufferedReader in = new BufferedReader( new InputStreamReader( gc.getinputstream())); String inputline; while ((inputline = in.readline())!= null) System.out.println(inputLine); in.close();

Można też od razu tak: import java.net.*; import java.io.*; public class URLRead { public static void main(string[] args) throws Exception { URL url = new URL( args[0] ); InputStreamReader in = new InputStreamReader( url.openstream()); String input= in.read(); System.out.println(input); in.close();

URLe w Swingu import javax.swing.*; import javax.swing.event.*; import javax.swing.text.html.*;... editorpane.addhyperlinklistener( new HyperlinkListener() { public void hyperlinkupdate(hyperlinkevent e) { if (e.geteventtype() == HyperlinkEvent.EventType.ACTIVATED) { JEditorPane pane = (JEditorPane) e.getsource(); if (e instanceof.htmlframehyperlinkevent) { HTMLFrameHyperlinkEvent evt = (HTMLFrameHyperlinkEvent)e; HTMLDocument doc = (HTMLDocument)pane.getDocument(); doc.processhtmlframehyperlinkevent(evt); else { try { pane.setpage(e.geturl()); catch (Throwable t) { t.printstacktrace(); );

RMI (Remote Method Invocation): mechanizm wywoływania metod klas działających na innej maszynie wirtualnej.

Co to jest RMI RMI to API wspomagające tworzenie rozproszonych aplikacji obiektowych (Distributed Object Application) Aplikacja taka składa się zwykle z kilku (min. 2) programów, działających na różnych komputerach Najprostszy model to działający na jednym z komputerów program-klient, który wywołuje metody obiektów programu-serwera. RMI zapewnia mechanizm komunikacji klienta z serwerem

Co to jest RMI RMI RMI Internet

Wymagania Lokalizacja zdalnych obiektów Komunikacja ze zdalnymi obiektami Przekazywanie kodu pośredniego RMI Rejestr HTTP Klient HTTP RMI RMI Serwer WWW Serwer WWW HTTP Serwer

Mechanizm komunikacji Klient Namiastka Odbiornik Serwer

Namiastka i Obiorca Namiastka: tworzy po stronie klienta blok danych zawierający: opis wywoływanej metody identyfikator zdalnego obiektu parametry (serializowane) wysyła dane do serwera odbiera i rozpakowuje wynik Odbiorca: odtwarza parametry lokalizuje obiekt wywołuje metodę pobiera wynik (wyjątek) serializuje go wysyła dane do namiastki

Klient (przykładowy) import java.rmi.naming; import java.rmi.rmisecuritymanager; public class ShowQuote { public static void main(string args[]) throws Exception { // Bywa jeszcze SecurityManager String url= "rmi://localhost:1313/quoter"; Quoter quoter = (Quoter)Naming.lookup( url ); System.out.println(quoter.getQuote());

Interfejs zdalny import java.rmi.remote; import java.rmi.remoteexception; public interface Quoter extends Remote { public abstract String getquote() throws RemoteException;

Implementacja (zdalnego interfejsu Quoter) import java.rmi.*; import java.rmi.server.*; public class RMIQuoter extends UnicastRemoteObject implements Quoter { public RMIQuoter() throws RemoteException { public String getquote(){ return "Na razie nic mądrego";

Serwer import java.rmi.naming; public class RMIServer { public static void main(string args[]) throws Exception { RMIQuoter rmiquoter = new RMIQuoter(); Naming.bind( "Quoter", rmiquoter); System.out.println("Quoter ready.");

Wdrożenie Rejestr Serwer volt Klient Quoter.class RMIQuoter.class RMIQuoter_Stub.class RMIServer.class client.policy Quoter.class ShowQuote.class Serwer WWW max Quoter.class RMIQuoter_Stub.class grant { permission java.net.socketpermission "*:1024-65355", "connect"; permission java.net.socketpermission "*:80", "connect"; ;

Uruchomienie Maszyna serwera: $ rmiregistry & $ java -Djava.rmi.server.codebase=http:/max/~jstar/rmi_down/ RMIServer & Klient: $ java -Djava.security.policy=client.policy ShowQuote volt

Serwer aktywowany RMI pozwala tworzyć tanie środowiska obliczeniowe o dużej mocy Tworzenie i rejestracja obiektów zanim jakiś klient zechce z nich skorzystać może być nieefektywne Serwery aktywowane są generowane na żądanie klienta Ze strony klienta wszystko wygląda tak samo Po stronie maszyny-serwera działa program aktywujący, który tworzy serwery na żądanie

Serwer aktywowany import java.rmi.*; import java.rmi.activation.*; public class ActRMIQuoter extends Activatable implements Quoter { String quote; public String getquote()throws RemoteException { return "Na razie nic mädrego"; public ActRMIQuoter( ActivationID id, MarshalledObject data ) throws RemoteException { super( id, 0 ); quote= (String) data.get();

Aktywator import... public class RMIActivator { public static void main(string args[]) throws Exception { Properties props= new Properties(); props.put("java.security.policy", new File("server.policy").getCanonicalPath() ); ActivationGroupDesc grdesc= new ActivationGroupDesc( props, null ); ActivationGroupID agid= ActivationGroup.getSystem().registerGroup( grdesc ); String classurl= args.length == 0? new File( "." ).getcanonicalfile().tourl().tostring() : args[0]; System.out.println( "Class URL=" + classurl ); ActivationDesc adsc= new ActivationDesc( agid, "ActRMIQuoter" classurl, new MarshalledObject( Cytat ) ); Quoter q= (Quoter)Activatable.register( adsc ); Naming.bind( "Quoter", q); System.out.println("Quoter ready. Exiting");

Wdrożenie aktywatora max Rejestr Serwer ActRMIQuoter.class ActRMIQuoter_Stub.class RMIActivator.class rmid.policy Quoter.class server.policy Serwer WWW Quoter.class ActRMIQuoter_Stub.class volt Klient client.policy Quoter.class ShowQuote.class grant { permission com.sun.rmi.rmid.execpermission "${java.home${/bin${/java"; permission com.sun.rmi.rmid.execoptionpermission "-Djava.security.policy=*"; ; grant { permission java.security.allpermission "", ""; ;

Uruchomienie Maszyna serwera: $ rmiregistry \ -J-Djava.rmi.server.codebase=http:/max/~jstar/rmi_down/ & $ rmid -J-Djava.security.policy=rmid.policy & $ java RMIActivator http://max/~jstar/rmi_down/ Klient: $ java -Djava.security.policy=client.policy ShowQuote volt

Ćwiczenia: 1. Pobrać: http://www.iem.pw.edu.pl/~jstar/rmiclient.tgz, skompilować i uruchomić klienta Poeksperymentować z plikiem policy 2. Pobrać: http://www.iem.pw.edu.pl/~jstar/rmiserver.tgz, skompilować i uruchomić server 3. Napisać i wdrożyć własną aplikację: klient wysyła do serwera napis (np. imię), serwer odpowiada Witaj <imię>