Transcript jini1

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”.
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
Service
Provider
Jini Lookup
Service
Service
Consumer
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)
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
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/jinicore.jar:/usr/local/Java/jini1_1/lib/jiniext.jar:/usr/local/Java/jini1_1/lib/sunutil.jar:/users/studs/bsc/2000/liyboviz/files/service -d
/users/studs/bsc/2000/liyboviz/files/service
/users/studs/bsc/2000/liyboviz/files/corejini/chapter5/HelloWorldS
erviceInterface.java
/users/studs/bsc/2000/liyboviz/files/corejini/chapter5/HelloWorldS
ervice.java
Compile the client class:
javac -classpath /usr/local/Java/jini1_1/lib/jinicore.jar:/usr/local/Java/jini1_1/lib/jiniext.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/HelloWorld
ServiceInterface.java
/users/studs/bsc/2000/liyboviz/files/corejini/chapter5/HelloWorldC
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/jinicore.jar:/usr/local/Java/jini1_1/lib/jiniext.jar:/usr/local/Java/jini1_1/lib/sunutil.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 example
grant {
// Allow everything for now
permission
java.security.AllPermission;
};
The
End
To be continued...