Presentation is loading. Please wait.

Presentation is loading. Please wait.

RMI Observing the Distributed Pattern. Adrian German Lecturer, Computer Science Indiana University Bloomington.

Similar presentations


Presentation on theme: "RMI Observing the Distributed Pattern. Adrian German Lecturer, Computer Science Indiana University Bloomington."— Presentation transcript:

1 RMI Observing the Distributed Pattern. Adrian German Lecturer, Computer Science Indiana University Bloomington

2 RMI Observing the Distributed Pattern. Adrian German Lecturer, Computer Science Indiana University Bloomington Java

3

4

5

6

7

8

9 join

10 registered

11 join

12 registered

13 join

14 registered

15

16 broadcast

17 “Hello!”

18 broadcast( ) “Hello!”

19 broadcast( ) “Hello!”

20

21

22 client

23

24

25 server

26 client server (host)

27 client server (host) The difference is that the server is listed in the phone book.

28 client server (host) The difference is that the server is listed in the phone book (while a client isn’t).

29 client server (host) How do we implement this?

30 client server (host)

31 client server (host)

32 client server (host) class Server { Client[] clients; void broadcast(String message) {... } int register(Client client) {... } }

33 client server (host) class Server { Client[] clients; void broadcast(String message) {... } int register(Client client) {... } } class Client { void register(int index, Client client) {... } void update(Message msg) {... } }

34 client server (host) class Server { Client[] clients; void broadcast(String message) {... } int register(Client client) {... } } class Client { void register(int index, Client client) {... } void update(Message msg) {... } } Clients call the server's broadcast method in turn, which calls the clients' update.

35 client server (host)

36 client server

37 client

38 server client f

39 server client f f client.f(...) calls server.f(...)

40 server client f f g client.f(...) calls server.f(...) which in turn calls client.g(...)

41 server client f f g client.f(...) calls server.f(...) which in turn calls client.g(...) The question is: how do we turn this code into a distributed program?

42 server client f f g client.f(...) calls server.f(...) which in turn calls client.g(...) The question is: how do we turn this code into a distributed program?

43 server client f f g client.f(...) calls server.f(...) which in turn calls client.g(...) The question is: how do we turn this code into a distributed program? (Hawaii) (Sweden) Internet this local program

44 even simpler

45 function call server add() client fun() value returned

46 function call server add() client fun() value returned class Server { int add(int a, int b) { return a + b; } class Client { void fun(Server server) { System.out.println(server.add(1, 2)); } class LocalProgram { public static void main(String[] args) { Server a = new Server(); Client b = new Client(); b.fun(a); }

47 function call server add() client fun() value returned class LocalProgram { public static void main(String[] args) { Server a = new Server(); Client b = new Client(); b.fun(a); } Important questions: a)who creates the server? b)who creates the client? c)does the client really initiate anything?

48 function call server add() client fun() value returned The difference between local and distributed computing is real. Differences are impossible to ignore at least in the following areas: a) latency, b) memory access, c) partial failure, and d) concurrency.... that is, at least at the present time as well as in the near future.

49 function call server add() client fun() value returned abstract class NetworkPeer implements java.rmi.Remote { public void exportMethods() throws java.rmi.RemoteException { java.rmi.server.UnicastRemoteObject.exportObject(this); } public java.rmi.Remote locatePeer( String peerHost, int peerPort, String peerName ) throws Exception { return java.rmi.Naming.lookup("rmi://" + peerHost + ":" + peerPort + "/" + peerName); } public void startAsNetworkClient( String peerHost, int peerPort, String peerName ) throws Exception { this.exportMethods(); java.rmi.Remote peer = this.locatePeer(peerHost, peerPort, peerName); this.startAsClientOf(peer); // see below... } public abstract void startAsClientOf( java.rmi.Remote peer ) throws java.rmi.RemoteException ; public abstract void startAsServer(); //... start as local server }

50 function call server add() client fun() value returned abstract class NetworkPeer implements java.rmi.Remote { public void exportMethods() throws java.rmi.RemoteException { java.rmi.server.UnicastRemoteObject.exportObject(this); } public java.rmi.Remote locatePeer( String peerHost, int peerPort, String peerName ) throws Exception { return java.rmi.Naming.lookup("rmi://" + peerHost + ":" + peerPort + "/" + peerName); } public void startAsNetworkClient( String peerHost, int peerPort, String peerName ) throws Exception { this.exportMethods(); java.rmi.Remote peer = this.locatePeer(peerHost, peerPort, peerName); this.startAsClientOf(peer); // see below... } public abstract void startAsClientOf( java.rmi.Remote peer ) throws java.rmi.RemoteException ; public abstract void startAsServer(); //... start as local server } Distributed processing is a world of free agents. The class above is all that an object needs to become a free agent. Any object.

51 function call server add() client fun() value returned abstract class NetworkPeer implements java.rmi.Remote { public void exportMethods() throws java.rmi.RemoteException { java.rmi.server.UnicastRemoteObject.exportObject(this); } public java.rmi.Remote locatePeer( String peerHost, int peerPort, String peerName ) throws Exception { return java.rmi.Naming.lookup("rmi://" + peerHost + ":" + peerPort + "/" + peerName); } public void startAsNetworkClient( String peerHost, int peerPort, String peerName ) throws Exception { this.exportMethods(); java.rmi.Remote peer = this.locatePeer(peerHost, peerPort, peerName); this.startAsClientOf(peer); // see below... } public abstract void startAsClientOf( java.rmi.Remote peer ) throws java.rmi.RemoteException ; public abstract void startAsServer(); //... start as local server } Distributed processing is a world of free agents. The class above is all that an object needs to become a free agent. Any object.

52 function call server add() client fun() value returned abstract class NetworkPeer implements java.rmi.Remote { public void exportMethods() throws java.rmi.RemoteException { java.rmi.server.UnicastRemoteObject.exportObject(this); } public java.rmi.Remote locatePeer( String peerHost, int peerPort, String peerName ) throws Exception { return java.rmi.Naming.lookup("rmi://" + peerHost + ":" + peerPort + "/" + peerName); } public void startAsNetworkClient( String peerHost, int peerPort, String peerName ) throws Exception { this.exportMethods(); java.rmi.Remote peer = this.locatePeer(peerHost, peerPort, peerName); this.startAsClientOf(peer); // see below... } public abstract void startAsClientOf( java.rmi.Remote peer ) throws java.rmi.RemoteException ; public abstract void startAsServer(); //... start as local server } Distributed processing is a world of free agents. The class above is all that an object needs to become a free agent. Any object.

53 function call server add() client fun() value returned class Server { int add(int a, int b) { return a + b; } class Client { void fun(Server server) { System.out.println(server.add(1, 2)); } class LocalProgram { public static void main(String[] args) { Server a = new Server(); Client b = new Client(); b.fun(a); }

54 class Server { int add(int a, int b) { return a + b; }

55 public class ServerImplementation extends NetworkPeer implements Server { public static void main(String[] args) { String portNumber = args[0], ownName = args[1]; ServerImplementation here = new ServerImplementation(); here.startAsNetworkServer(ownName, Integer.parseInt(portNumber)); } public void startAsClientOf(java.rmi.Remote peer) { } public void startAsServer() { } public int add(int a, int b) throws java.rmi.RemoteException { System.out.println("I am adding for the audience..."); return a + b; } public interface Server extends java.rmi.Remote { public int add(int a, int b) throws java.rmi.RemoteException; } function call server add() client fun() value returned class ServerImplementation extends NetworkPeer implements Server { public int add(int a, int b) throws java.rmi.RemoteException { return a + b; } public void startAsServer() { } public void startAsClientOf(java.rmi.Remote peer) { } public static void main(String[] args) { String portNumber = args[0], ownName = args[1]; ServerImplementation here = new ServerImplementation(); here.startAsNetworkServer(ownName, Integer.parseInt(portNumber)); } public interface Server extends java.rmi.Remote { public int add(int a, int b) throws java.rmi.RemoteException; }

56 class Client { void fun(Server server) { System.out.println(server.add(1, 2)); }

57 public class ClientImplementation extends NetworkPeer { public void startAsClientOf(java.rmi.Remote peer) throws java.rmi.RemoteException { this.fun((Server) peer); } void fun(Server server) throws java.rmi.RemoteException { System.out.println(server.add(2, 3)); } public static void main(String[] args) throws Exception { String ownName = args[0], serverHostName = args[1], serverPortNumber = args[2], serverName = args[3]; ClientImplementation client = new ClientImplementation(); client.startAsNetworkClientOf(serverHostName, Integer.parseInt(serverPortNumber), serverName); } public void startAsServer() { } }

58 class LocalProgram { public static void main(String[] args) { Server a = new Server(); Client b = new Client(); b.fun(a); }

59 class LocalSetup { public static void main(String[] args) throws java.rmi.RemoteException { ServerImplementation server = new ServerImplementation(); server.startAsServer(); ClientImplementation client = new ClientImplementation(); client.startAsClientOf(server); } class LocalProgram { public static void main(String[] args) { Server a = new Server(); Client b = new Client(); b.fun(a); }

60 class LocalSetup { public static void main(String[] args) throws java.rmi.RemoteException { ServerImplementation server = new ServerImplementation(); server.startAsServer(); ClientImplementation client = new ClientImplementation(); client.startAsClientOf(server); } class LocalProgram { public static void main(String[] args) { Server a = new Server(); Client b = new Client(); b.fun(a); }

61 class LocalSetup { public static void main(String[] args) throws java.rmi.RemoteException { ServerImplementation server = new ServerImplementation(); server.startAsServer(); ClientImplementation client = new ClientImplementation(); client.startAsClientOf(server); }

62 class LocalSetup { public static void main(String[] args) throws java.rmi.RemoteException { ServerImplementation server = new ServerImplementation(); server.startAsServer(); ClientImplementation client = new ClientImplementation(); client.startAsClientOf(server); }

63 class LocalSetup { public static void main(String[] args) throws java.rmi.RemoteException { ServerImplementation server = new ServerImplementation(); server.startAsServer(); ClientImplementation client = new ClientImplementation(); client.startAsClientOf(server); } LocalSetup

64 class LocalSetup { public static void main(String[] args) throws java.rmi.RemoteException { ServerImplementation server = new ServerImplementation(); server.startAsServer(); ClientImplementation client = new ClientImplementation(); client.startAsClientOf(server); } LocalSetup Server

65 class LocalSetup { public static void main(String[] args) throws java.rmi.RemoteException { ServerImplementation server = new ServerImplementation(); server.startAsServer(); ClientImplementation client = new ClientImplementation(); client.startAsClientOf(server); } LocalSetup Client Server

66 class LocalSetup { public static void main(String[] args) throws java.rmi.RemoteException { ServerImplementation server = new ServerImplementation(); server.startAsServer(); ClientImplementation client = new ClientImplementation(); client.startAsClientOf(server); } LocalSetup Client Server

67 class LocalSetup { public static void main(String[] args) throws java.rmi.RemoteException { ServerImplementation server = new ServerImplementation(); server.startAsServer(); ClientImplementation client = new ClientImplementation(); client.startAsClientOf(server); } LocalSetup Client Server

68 class LocalSetup { public static void main(String[] args) throws java.rmi.RemoteException { ServerImplementation server = new ServerImplementation(); server.startAsServer(); ClientImplementation client = new ClientImplementation(); client.startAsClientOf(server); } LocalSetup Client Server

69 class LocalSetup { public static void main(String[] args) throws java.rmi.RemoteException { ServerImplementation server = new ServerImplementation(); server.startAsServer(); ClientImplementation client = new ClientImplementation(); client.startAsClientOf(server); } LocalSetup Client Server

70 class LocalSetup { public static void main(String[] args) throws java.rmi.RemoteException { ServerImplementation server = new ServerImplementation(); server.startAsServer(); ClientImplementation client = new ClientImplementation(); client.startAsClientOf(server); } LocalSetup Client Server

71 class LocalSetup { public static void main(String[] args) throws java.rmi.RemoteException { ServerImplementation server = new ServerImplementation(); server.startAsServer(); ClientImplementation client = new ClientImplementation(); client.startAsClientOf(server); } LocalSetup Client Server So although there is no network there is already a change of attitude.

72 public abstract class NetworkPeer implements java.rmi.Remote { public void exportMethods() throws java.rmi.RemoteException { java.rmi.server.UnicastRemoteObject.exportObject(this); } public java.rmi.Remote locatePeer(String peerHost, int peerPort, String peerName) throws Exception { return java.rmi.Naming.lookup("rmi://" + peerHost + ":" + peerPort + "/" + peerName); } public void startAsNetworkClientOf(String peerHost, int peerPort, String peerName) throws Exception { this.exportMethods(); java.rmi.Remote peer = this.locatePeer(peerHost, peerPort, peerName); this.startAsClientOf(peer); // see below... } public abstract void startAsClientOf(java.rmi.Remote peer) throws java.rmi.RemoteException; public void startAsNetworkServer(String name, int port) { System.setSecurityManager(new java.rmi.RMISecurityManager()); try { this.exportMethods(); java.rmi.registry.Registry registry = java.rmi.registry.LocateRegistry.createRegistry(port); registry.bind(name, this); this.startAsServer(); // see below... System.out.println("Server is ready... "); } catch (Exception e) { System.out.println("Server error: " + e + "... "); } public abstract void startAsServer(); }

73 public abstract class NetworkPeer implements java.rmi.Remote { public void exportMethods() throws java.rmi.RemoteException { java.rmi.server.UnicastRemoteObject.exportObject(this); } public java.rmi.Remote locatePeer(String peerHost, int peerPort, String peerName) throws Exception { return java.rmi.Naming.lookup("rmi://" + peerHost + ":" + peerPort + "/" + peerName); } public void startAsNetworkClientOf(String peerHost, int peerPort, String peerName) throws Exception { this.exportMethods(); java.rmi.Remote peer = this.locatePeer(peerHost, peerPort, peerName); this.startAsClientOf(peer); // see below... } public abstract void startAsClientOf(java.rmi.Remote peer) throws java.rmi.RemoteException; public void startAsNetworkServer(String name, int port) { System.setSecurityManager(new java.rmi.RMISecurityManager()); try { this.exportMethods(); java.rmi.registry.Registry registry = java.rmi.registry.LocateRegistry.createRegistry(port); registry.bind(name, this); this.startAsServer(); // see below... System.out.println("Server is ready... "); } catch (Exception e) { System.out.println("Server error: " + e + "... "); } public abstract void startAsServer(); }

74 public abstract class NetworkPeer implements java.rmi.Remote { public void exportMethods() throws java.rmi.RemoteException {... } public java.rmi.Remote locatePeer(String peerHost, int peerPort, String peerName) throws Exception { return java.rmi.Naming.lookup("rmi://" + peerHost + ":" + peerPort + "/" + peerName); } public void startAsNetworkClientOf(String peerHost, int peerPort, String peerName) throws Exception { this.exportMethods(); java.rmi.Remote peer = this.locatePeer(peerHost, peerPort, peerName); this.startAsClientOf(peer); // see below... } public abstract void startAsClientOf(java.rmi.Remote peer) throws java.rmi.RemoteException; public void startAsNetworkServer(String name, int port) { System.setSecurityManager(new java.rmi.RMISecurityManager()); try { this.exportMethods(); java.rmi.registry.Registry registry = java.rmi.registry.LocateRegistry.createRegistry(port); registry.bind(name, this); this.startAsServer(); // see below... System.out.println("Server is ready... "); } catch (Exception e) { System.out.println("Server error: " + e + "... "); } public abstract void startAsServer(); }

75 public abstract class NetworkPeer implements java.rmi.Remote { public void exportMethods() throws java.rmi.RemoteException {... } public java.rmi.Remote locatePeer(... peerHost,... peerPort,... peerName)... {... } public void startAsNetworkClientOf(String peerHost, int peerPort, String peerName) throws Exception { this.exportMethods(); java.rmi.Remote peer = this.locatePeer(peerHost, peerPort, peerName); this.startAsClientOf(peer); // see below... } public abstract void startAsClientOf(java.rmi.Remote peer) throws java.rmi.RemoteException; public void startAsNetworkServer(String name, int port) { System.setSecurityManager(new java.rmi.RMISecurityManager()); try { this.exportMethods(); java.rmi.registry.Registry registry = java.rmi.registry.LocateRegistry.createRegistry(port); registry.bind(name, this); this.startAsServer(); // see below... System.out.println("Server is ready... "); } catch (Exception e) { System.out.println("Server error: " + e + "... "); } public abstract void startAsServer(); }

76 public abstract class NetworkPeer implements java.rmi.Remote { public void exportMethods() throws java.rmi.RemoteException {... } public java.rmi.Remote locatePeer(... peerHost,... peerPort,... peerName)... {... } public void startAsNetworkClientOf(String peerHost, int peerPort, String peerName) throws Exception { this.exportMethods(); java.rmi.Remote peer = this.locatePeer(peerHost, peerPort, peerName); this.startAsClientOf(peer); // see below... } public abstract void startAsClientOf(java.rmi.Remote peer) throws java.rmi.RemoteException; public void startAsNetworkServer(String name, int port) { System.setSecurityManager(new java.rmi.RMISecurityManager()); try { this.exportMethods(); java.rmi.registry.Registry registry = java.rmi.registry.LocateRegistry.createRegistry(port); registry.bind(name, this); this.startAsServer(); // see below... System.out.println("Server is ready... "); } catch (Exception e) { System.out.println("Server error: " + e + "... "); } public abstract void startAsServer(); }

77 public abstract class NetworkPeer implements java.rmi.Remote { public void exportMethods() throws java.rmi.RemoteException {... } public java.rmi.Remote locatePeer(... peerHost,... peerPort,... peerName)... {... } public void startAsNetworkClientOf(... peerHost,... peerPort,... peerName)... {... } public abstract void startAsClientOf(java.rmi.Remote peer) throws java.rmi.RemoteException; public void startAsNetworkServer(String name, int port) { System.setSecurityManager(new java.rmi.RMISecurityManager()); try { this.exportMethods(); java.rmi.registry.Registry registry = java.rmi.registry.LocateRegistry.createRegistry(port); registry.bind(name, this); this.startAsServer(); // see below... System.out.println("Server is ready... "); } catch (Exception e) { System.out.println("Server error: " + e + "... "); } public abstract void startAsServer(); }

78 public abstract class NetworkPeer implements java.rmi.Remote { public void exportMethods() throws java.rmi.RemoteException {... } public java.rmi.Remote locatePeer(... peerHost,... peerPort,... peerName)... {... } public void startAsNetworkClientOf(... peerHost,... peerPort,... peerName)... {... } public abstract void startAsClientOf(java.rmi.Remote peer) throws java.rmi.RemoteException; public void startAsNetworkServer(String name, int port) { System.setSecurityManager(new java.rmi.RMISecurityManager()); try { this.exportMethods(); java.rmi.registry.Registry registry = java.rmi.registry.LocateRegistry.createRegistry(port); registry.bind(name, this); this.startAsServer(); // see below... System.out.println("Server is ready... "); } catch (Exception e) { System.out.println("Server error: " + e + "... "); } public abstract void startAsServer(); }

79 public abstract class NetworkPeer implements java.rmi.Remote { public void exportMethods() throws java.rmi.RemoteException {... } public java.rmi.Remote locatePeer(... peerHost,... peerPort,... peerName)... {... } public void startAsNetworkClientOf(... peerHost,... peerPort,... peerName)... {... } public abstract void startAsClientOf(java.rmi.Remote peer) throws java.rmi.RemoteException; public void startAsNetworkServer(String name, int port) { System.setSecurityManager(new java.rmi.RMISecurityManager()); try { this.exportMethods(); java.rmi.registry.Registry registry = java.rmi.registry.LocateRegistry.createRegistry(port); registry.bind(name, this); this.startAsServer(); // see below... System.out.println("Server is ready... "); } catch (Exception e) { System.out.println("Server error: " + e + "... "); } public abstract void startAsServer(); }

80 tucotuco.cs.indiana.edu% pwd /nfs/paca/san/r1a0l1/dgerman/october-21 tucotuco.cs.indiana.edu% ls -ld *.java -rw-r--r-- 1 dgerman faculty 761 Oct 21 00:59 ClientImplementation.java -rw-r--r-- 1 dgerman faculty 293 Oct 21 00:57 LocalSetup.java -rw-r--r-- 1 dgerman faculty 1524 Oct 21 00:54 NetworkPeer.java -rw-r--r-- 1 dgerman faculty 117 Oct 21 00:59 Server.java -rw-r--r-- 1 dgerman faculty 551 Oct 21 01:06 ServerImplementation.java tucotuco.cs.indiana.edu% javac *.java tucotuco.cs.indiana.edu% rmic NetworkPeer tucotuco.cs.indiana.edu% rmic ServerImplementation tucotuco.cs.indiana.edu% java ServerImplementation 16450 Dirac burrowww.cs.indiana.edu% pwd /nfs/paca/san/r1a0l1/dgerman/october-21 burrowww.cs.indiana.edu% ls -ld * -rw-r--r-- 1 dgerman faculty 975 Oct 21 01:34 ClientImplementation.class -rw-r--r-- 1 dgerman faculty 761 Oct 21 00:59 ClientImplementation.java -rw-r--r-- 1 dgerman faculty 498 Oct 21 01:34 LocalSetup.class -rw-r--r-- 1 dgerman faculty 293 Oct 21 00:57 LocalSetup.java -rw-r--r-- 1 dgerman faculty 1938 Oct 21 01:34 NetworkPeer.class -rw-r--r-- 1 dgerman faculty 1524 Oct 21 00:54 NetworkPeer.java -rw-r--r-- 1 dgerman faculty 908 Oct 21 01:34 NetworkPeer_Skel.class -rw-r--r-- 1 dgerman faculty 482 Oct 21 01:34 NetworkPeer_Stub.class -rw-r--r-- 1 dgerman faculty 191 Oct 21 01:34 Server.class -rw-r--r-- 1 dgerman faculty 117 Oct 21 00:59 Server.java -rw-r--r-- 1 dgerman faculty 886 Oct 21 01:34 ServerImplementation.class -rw-r--r-- 1 dgerman faculty 551 Oct 21 01:06 ServerImplementation.java -rw-r--r-- 1 dgerman faculty 1611 Oct 21 01:34 ServerImplementation_Skel.class -rw-r--r-- 1 dgerman faculty 3134 Oct 21 01:34 ServerImplementation_Stub.class burrowww.cs.indiana.edu% java ClientImplementation Larry tucotuco.cs.indiana.edu 16450 Dirac burrowww.cs.indiana.edu% java LocalSetup I am adding for the audience... 5 burrowww.cs.indiana.edu% java ServerImplementation 16450 Dirac Server is ready... I am adding for the audience... tucotuco.cs.indiana.edu% java ClientImplementation Larry burrowww.cs.indiana.edu 16450 Dirac 5 1 2 3 4 5

81 More sophisticated example:

82

83

84

85

86

87

88 In this last example topology was more general. Clients were also acting as servers. The only difference is that they still need a moderator to start participating.

89 Conclusions 1. The NetworkPeer abstraction successfully summarizes the "RMI recipe". 2. The LocalSetup program allows for the local development and testing. 3. The use of this pattern is similar to the use of the MVC pattern. 4. Clients need to be implemented as Threads. Their synchronization rules must be as simple as possible. As "decentralized" as possible, so as to not assume the existence of the OS. 5. Using the programmer's API the application can run both ways. 6. This approach is good when few developers and use of Java is preferred. 7. Further work will address the question: does an extremely unreliable network breaks any of the above? Unreliable means: lost references, exceptions are actually the rule, etc.


Download ppt "RMI Observing the Distributed Pattern. Adrian German Lecturer, Computer Science Indiana University Bloomington."

Similar presentations


Ads by Google