import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.*; 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 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 } catch (Exception e) { System.out.println("Server error: " + e + " ... "); } } public void startAsServer() { // essentially empty implementation, just like the method below System.out.println("Server is ready ... "); } public void startAsClientOf(java.rmi.Remote peer) throws java.rmi.RemoteException { System.out.println("Client created/started... "); } }