mini project - 2001/2 jini - a new computing paradigm
TRANSCRIPT
Mini project - 2001/2
Jini - a new computing paradigm
Our first jini steps…basic topics:
1.RMI overview.
2.a first jini application: “hello world”.
rmirmi rmi
RMI-remote method invocation
provides a way for Java applications
running on different JVM’s/host computers to “talk” to each other.
basic ideas/concepts:
1.remote interface.
2.stubs and skeletons - rmic.
client server
Remote interface
Remote impl
stub skeleton
3.serialization.
4.parameters and return values.
5.dynamic code loading.
6.security implications.
7.marshaled objects.
8.the activation framework - rmid.
Jini basics
3 main components
1.service
2.client
3.jini environment - rmi,web
server, lookup service...
service• Device that shares its capabilities with other
devices
• Devices Requirement– Memory & CPU– Connection to Network
• E.g. TV, Microwave,Printer,PC,Software
client• A device that uses services• Requirement
– Memory & CPU– Connection to Network
• E.g. PDA, WAP Phone, PC, Coke Machine
The Jini environment
ServiceConsumer
ServiceProvider
Jini LookupService
How does it works?
1.create the jini environment-lookup server online.
2.services discover,join and register on lookup servers.
3.clients discover and finds matching and downloading services, then using them.
Our first jini application - hello world!
1.compiling & running the jini env.
2.compiling & running
a)server. b)client.
Creating The jini environment:
1.run a http server (jini provides a simple but efficient one)
2.run a rmi daemon (exists on Java 2)
3.run a lookup server (supplied with the reggie.jar files in jini)
Running the environment command lines:
http server:java -jar java archive
/usr/local/Java/jini1_1/lib/tools.jar jini’s http
-port 8087
-dir /usr/local/Java/jini1_1/lib the server’s root
directory
-verbose&
Rmi daemon:rmid -J-Dsun.rmi.activation.execPolicy=none
-port 1100
-log /tmp/rmid_log& rmi log directory-recvering...
Running the environment command lines:
Lookup server:java
-Djava.security.policy=/usr/local/Java/jini1_1
/example/lookup/policy.all policy
-jar
/usr/local/Java/jini1_1/lib/reggie.jar lookup service
http://silver.cs.bgu.ac.il:8087/reggie-dl.jar codebase
/usr/local/Java/jini1_1/example/lookup/policy.all
/tmp/reggie_log1 public& policy
Compiling the server and client programs:Compile the server class:javac -classpath /usr/local/Java/jini1_1/lib/jini-core.jar:/usr/local/Java/jini1_1/lib/jini-ext.jar:/usr/local/Java/jini1_1/lib/sun-util.jar:/users/studs/bsc/2000/liyboviz/files/service -d /users/studs/bsc/2000/liyboviz/files/service /users/studs/bsc/2000/liyboviz/files/corejini/chapter5/HelloWorldServiceInterface.java /users/studs/bsc/2000/liyboviz/files/corejini/chapter5/HelloWorldService.java
Compile the client class:javac -classpath /usr/local/Java/jini1_1/lib/jini-core.jar:/usr/local/Java/jini1_1/lib/jini-ext.jar:/usr/local/Java/jini1_1/lib/sun-util.jar: -d /users/studs/bsc/2000/liyboviz/files/client /users/studs/bsc/2000/liyboviz/files//corejini/chapter5/HelloWorldServiceInterface.java /users/studs/bsc/2000/liyboviz/files/corejini/chapter5/HelloWorldClient.java
Running - first the server, then the client:
Server http:java -jar /usr/local/Java/jini1_1/lib/tools.jar -port 8085 -dir /users/studs/bsc/2000/liyboviz/files/service-dl -verbose&
The Service:java -cp /usr/local/Java/jini1_1/lib/jini-core.jar:/usr/local/Java/jini1_1/lib/jini-ext.jar:/usr/local/Java/jini1_1/lib/sun-util.jar:/users/studs/bsc/2000/liyboviz/files/service
-Djava.rmi.server.codebase=http://silver.cs.bgu.ac.il:8085/
-Djava.security.policy=/usr/local/Java/jini1_1/example/lookup
/policy.all corejini.chapter5.HelloWorldService&
Running – then, the client:
The Client:java -cp /usr/local/Java/jini1_1/lib/jini-core.jar:
/usr/local/Java/jini1_1/lib/jini-ext.jar:
/usr/local/Java/jini1_1/lib/sun-util.jar:
/users/studs/bsc/2000/liyboviz/files/client
-Djava.security.policy=/usr/local/Java/jini1_1/example/lookup
/policy.all
corejini.chapter5.HelloWorldClient&
Screen output
From the service:
>discovered a lookup service!
>set serviceID to e91bb-53434-ty7554
From the client:
>Got matching service.
>Its message is: Hello, world!
What’s behind the screen?
The client/server known interface:// This is the interface that the service's proxy
// implements
package corejini.chapter5;
public interface HelloWorldServiceInterface {
public String getMessage();
}
The server’s code:// This is the first iteration of a Hello, World
// service--it publishes a proxy that returns
// a string when asked by clients.
package corejini.chapter5;
import net.jini.discovery.DiscoveryListener;
import net.jini.discovery.DiscoveryEvent;
import net.jini.discovery.LookupDiscovery;
import net.jini.core.lookup.ServiceItem;
import net.jini.core.lookup.ServiceRegistrar;
import net.jini.core.lookup.ServiceRegistration;
import java.util.Hashtable;
import java.io.IOException;
import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
// This is the proxy object that will be downloaded
// by clients. It's serializable and implements
// our well-known HelloWorldServiceInterface.
class HelloWorldServiceProxy implements Serializable,
HelloWorldServiceInterface {
public HelloWorldServiceProxy() {
}
public String getMessage() {
return "Hello, world!";
}
}
// HelloWorldService is the "wrapper" class that
// handles publishing the service item.
public class HelloWorldService implements Runnable {
// 10 minute leases
protected final int LEASE_TIME = 10 * 60 * 1000;
protected Hashtable registrations = new Hashtable();
protected ServiceItem item;
protected LookupDiscovery disco;
// Inner class to listen for discovery events
class Listener implements DiscoveryListener {
// Called when we find a new lookup service.
public void discovered(DiscoveryEvent ev) {
System.out.println("discovered a lookup service!");
ServiceRegistrar[] newregs = ev.getRegistrars();
for (int i=0 ; i<newregs.length ; i++) {
if (!registrations.containsKey(newregs[i])) {
registerWithLookup(newregs[i]);
}}}
// Called ONLY when we explicitly discard a
// lookup service, not "automatically" when a
// lookup service goes down. Once discovered,
// there is NO ongoing communication with a
// lookup service.
public void discarded(DiscoveryEvent ev) {
ServiceRegistrar[] deadregs = ev.getRegistrars();
for (int i=0 ; i<deadregs.length ; i++) {
registrations.remove(deadregs[i]);}}}
public HelloWorldService() throws IOException {
item = new ServiceItem(null, createProxy(), null);
// Set a security manager
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());}
// Search for the "public" group, which by
// convention is named by the empty string
disco = new LookupDiscovery(new String[] { "" });
// Install a listener.
disco.addDiscoveryListener(new Listener()); }
protected HelloWorldServiceInterface createProxy() {
return new HelloWorldServiceProxy();}
// This work involves remote calls, and may take a while to complete
//Thus, since it's called from discovered(), it will prevent us
// from responding in a timely fashion to new discovery events. An
// improvement would be to spin off a separate short-
// lived thread to do the work.
protected synchronized void registerWithLookup(ServiceRegistrar registrar) {
ServiceRegistration registration = null;
try {
registration = registrar.register(item, LEASE_TIME);
} catch (RemoteException ex) {
System.out.println("Couldn't register: " + ex.getMessage());
return;}
if (item.serviceID == null) {
item.serviceID = registration.getServiceID();
System.out.println("Set serviceID to " + item.serviceID);}
registrations.put(registrar, registration); }
// This thread does nothing but sleep, but it
// makes sure the VM doesn't exit.
public void run() {
while (true) {
try {
Thread.sleep(1000000);
} catch (InterruptedException ex) {
}}}
// Create a new HelloWorldService and start
// its thread.
public static void main(String args[]) {
try {
HelloWorldService hws = new HelloWorldService();
new Thread(hws).start();
} catch (IOException ex) {
System.out.println("Couldn't create service: " +
ex.getMessage());}}}
The client’s code:
// A simple Client to exercise the HelloWorldService
package corejini.chapter5;
import net.jini.discovery.DiscoveryListener;
import net.jini.discovery.DiscoveryEvent;
import net.jini.discovery.LookupDiscovery;
import net.jini.core.lookup.ServiceRegistrar;
import net.jini.core.lookup.ServiceTemplate;
import java.util.Vector;
import java.io.IOException;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
public class HelloWorldClient implements Runnable {
protected ServiceTemplate template;
protected LookupDiscovery disco;
// An inner class to implement DiscoveryListener
class Listener implements DiscoveryListener {
public void discovered(DiscoveryEvent ev) {
ServiceRegistrar[] newregs = ev.getRegistrars();
for (int i=0 ; i<newregs.length ; i++) {
lookForService(newregs[i]);
}
}
public void discarded(DiscoveryEvent ev) {
}
}
public HelloWorldClient() throws IOException {
Class[] types = { HelloWorldServiceInterface.class };
template = new ServiceTemplate(null, types, null);
// Set a security manager
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
// Only search the public group
disco = new LookupDiscovery(new String[] { "" });
// Install a listener
disco.addDiscoveryListener(new Listener());
}
// Once we've found a new lookup service, search
// for proxies that implement
// HelloWorldServiceInterface
protected Object lookForService(ServiceRegistrar lusvc) {
Object o = null;
try {
o = lusvc.lookup(template);
} catch (RemoteException ex) {
System.err.println("Error doing lookup: " + ex.getMessage());
return null;}
if (o == null) {
System.err.println("No matching service.");
return null;
}
System.out.println("Got a matching service.");
System.out.println("It's message is: " +
((HelloWorldServiceInterface) o).getMessage());
return o;}
// This thread does nothing--it simply keeps the
// VM from exiting while we do discovery.
public void run() {
while (true) {
try {
Thread.sleep(1000000);
} catch (InterruptedException ex) {
}}}
// Create a HelloWorldClient and start its thread
public static void main(String args[]) {
try {
HelloWorldClient hwc = new HelloWorldClient();
new Thread(hwc).start();
} catch (IOException ex) {
System.out.println("Couldn't create client: " +
ex.getMessage());
}}}
A policy file examplegrant {
// Allow everything for now
permission java.security.AllPermission;
};
The
EndTo be continued...