Download presentation
Presentation is loading. Please wait.
Published byAugust Peters Modified over 6 years ago
1
Јава - RMI Дизајн симулатора дискретних догађаја опште намене обухвата пројектовање више различитих структурних нивоа. Унутар сваког од структурних нивоа постоји скуп градивних блокова зависних од семантике конкретног нивоа. Овај рад има за циљ да представи интегрални поступак дизајна заснован на употреби независно формираних градивних блокова повезаних предметом симулације. Представљени дизајн је верификован имплементацијом алата заснованог на описаном поступку. Предности примене предложеног решења су размотрени уз осврт на могућа унапређења.
2
Промена парадигме
3
RMI
4
Комуникација са удаљеним објектом
5
Креирање интерфејса За све објекте који ће се приступати удаљено мора се креирати интерфејс преко кога се приступа одговарајућем објекту: import java.rmi.*; public interface Validator extends Remote{ String validate(String aUserName, String aPassword) throws RemoteException; }
6
Креирање класе import java.rmi.*; import java.util.*;
import java.rmi.server.UnicastRemoteObject; public class ValidatorImpl extends UnicastRemoteObject implements Validator{ Map memberMap; public ValidatorImpl() throws RemoteException{ memberMap = new HashMap(); memberMap.put("John", "Appleseed"); } public String validate(String aUserName, String aPassword) throws RemoteException{ if(getMemberMap().containsKey(aUserName)&& getMemberMap().get(aUserName).equals(aPassword)) return "Welcome " + aUserName; return "Sorry invalid login information!"; public Map getMemberMap(){ return memberMap;
7
Повезивање имена са објектом
import java.net.*; import java.rmi.*; public class LoginServer{ public static String server = …; public static int port = …; public static void main(String args[]){ try{ System.setSecurityManager(new RMISecurityManager()); LocateRegistry.createRegistry(port); ValidatorImpl aValidator = new ValidatorImpl(); String urlString = "//" + server + ":" + port + "/validator"; Naming.rebind(urlString , aValidator); System.out.println("Login server open for business"); }catch(RemoteException e){ //catches a RemoteException e.printStackTrace(); }catch(MalformedURLException me){ System.out.println("MalformedURLException " + me); }
8
Креирање клијента import java.rmi.*; import java.net.*;
public class ValidatorClient{ public static void main(String args[]){ if(args.length==0||!args[0].startsWith("rmi:")){ System.out.println("Usage: java ValidatorClient" + "rmi://host.domain:port/validator username password"); } try{ System.setSecurityManager(new RMISecurityManager()); Object remote = Naming.lookup(args[0]); Validator reply = (Validator)remote; System.out.println(reply.validate(args[1], args[2])); }catch(MalformedURLException me){ System.out.println(args[0] + " is not a valid URL"); }catch(RemoteException nbe){ System.out.println("Could not find requested object on the server");
9
Заштита java.policy grant { // Allow everything for now
permission java.security.AllPermission; };
10
Коришћење Превођење: javac -d . *.java rmic ValidatorImpl Покретање:
start rmiregistry java -Djava.security.policy=java.policy LoginServer java -Djava.security.policy=java.policy ValidatorClient rmi://host.domain:port/validator username password
11
Задаци
12
The Savings Account problem
Рачун у банци може да дели више корисника. Сваки корисник може да уплаћује и подиже новац са рачуна под условом да салдо на рачуну никада не буде негативан, као и да види тренутно стање рачуна. Решити проблем користећи удаљене позиве метода у Јави.
13
The Savings Account problem
import java.rmi.*; public interface Banck extends Remote { public UserAcount getUserAcount(String name) throws RemoteException; } public interface UserAcount extends Remote { public float getStatus() throws RemoteException; public void transaction(float value) throws RemoteException;
14
The Savings Account problem
import java.rmi.*; import java.rmi.server.*; import java.util.HashMap; public class BanckImpl extends UnicastRemoteObject implements Banck { private static transient HashMap users = new HashMap(); public BanckImpl() throws RemoteException {} public UserAcount getUserAcount(String name)throws RemoteException { synchronized(this){ UserAcountImpl user = (UserAcountImpl)users.get(name); if (user != null) { return user; } user = new UserAcountImpl(name); users.put(name, user);
15
The Savings Account problem
import java.rmi.*; import java.rmi.server.*; import java.io.Serializable; public class UserAcountImpl extends UnicastRemoteObject implements UserAcount, Serializable { private float status = 0; private String name; public UserAcountImpl (String name) throws RemoteException { this.name = name; } private void work(){ try { Thread.currentThread().sleep(500+(int)(Math.random()*1000)); } catch(InterruptedException e) {}
16
The Savings Account problem
public float getStatus() throws RemoteException { synchronized(this){ work(); return status; } public void transaction(float value) throws RemoteException{ while(status + value < 0){ try{ wait(); } catch(Exception ex){} status += value; notifyAll();
17
The Savings Account problem
import java.rmi.*; import java.rmi.registry.LocateRegistry; public class Server { public static final int port = 8181; public static final String server = " "; public static void main(String []args){ System.setSecurityManager(new RMISecurityManager()); try { LocateRegistry.createRegistry(port); System.out.println("Definisan Registry port"); System.out.println("BanckImpl: kreira Banck"); Banck dli = new BanckImpl(); System.out.println("BanckImpl: povezuje ga sa imenom"); String urlString = "//" + server + ":" + port + "/Banck"; System.out.println(urlString); Naming.rebind(urlString, dli); System.out.println("Banck je sada spremna"); } catch (Exception ex) { System.out.println("Desila se greska" + ex); ex.printStackTrace();} }
18
The Savings Account problem
import java.rmi.*; public class Client { public static final int port = 8181; public static final String server = " "; public static void main(String []args){ Banck dl = null; UserAcount UserAcount = null; String name = args[0]; System.setSecurityManager(new RMISecurityManager()); try { String url = "//" + server + ":" + port + "/Banck"; System.out.println("url = " + url); dl = (Banck)Naming.lookup(url); } catch (Exception e) { System.err.println("ERROR Naming.lookup" + e); System.exit(-1); }
19
The Savings Account problem
try { UserAcount = dl.getUserAcount(name); System.out.println("Nadjeni podaci za " + name); } catch (Exception e) { System.err.println("ERROR reaching " + name); System.exit(-1); } for(int m = 0; m < 100; m++){ float nstatus = (float)(50 + m - (int)(Math.random()*100)); System.out.println("Status: " + UserAcount.getStatus()); System.out.println("Promena statusa za " + nstatus); UserAcount.transaction(nstatus); System.out.println("Novi status: " + UserAcount.getStatus()); System.err.println("Greska pri transakciji za " + name);
20
The Savings Account problem
java.policy grant { // Allow everything for now permission java.security.AllPermission; }; Превођење: javac -d . *.java rmic UserAcountImpl BanckImpl Покретање: start rmiregistry java -Djava.security.policy=java.policy Server java -Djava.security.policy=java.policy Client pera
21
Питања? Захарије Радивојевић Електротехнички Факултет
Универзитет у Београду
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.