服务器端:
定义 客户端要访问的接口
package com.tx.distributed;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface TimeGenerator extends Remote {
java.util.Date getCurrentTime() throws RemoteException;
String sayHello() throws RemoteException;
void attach(DistributedClient obj, long d) throws RemoteException;
void detach(DistributedClient obj) throws RemoteException;
}
实现接口
package com.tx.distributed;
import java.io.Serializable;
import java.rmi.NotBoundException;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
public class TimeGeneratorImpl implements TimeGenerator, Serializable {
/**
*
*/
private static final long serialVersionUID = -3123942071701576393L;
/**
*
*/
private HashMap<DistributedClient, Object> clients = new HashMap<DistributedClient, Object>();
protected TimeGeneratorImpl() throws RemoteException {
super();
}
public static void main(String[] args)
{
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
try {
String name = "TimeGenerator";
TimeGenerator timeGenerator = new TimeGeneratorImpl();
TimeGenerator stub = (TimeGenerator) UnicastRemoteObject
.exportObject(timeGenerator, 0);
Registry registry = LocateRegistry.getRegistry();
registry.rebind(name, stub);
TimeGenerator t = (TimeGenerator) registry.lookup(name);
System.out.println("Server started on: " + t.getCurrentTime());
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
@Override
public Date getCurrentTime() throws RemoteException
{
Date date = new Date();
return date;
}
@Override
public String sayHello() throws RemoteException
{
return "Hello";
}
@Override
public void attach(DistributedClient obj,long d) throws RemoteException
{
clients.put(obj, "");
obj.update(new Date(Calendar.getInstance().getTimeInMillis() + d));
}
@Override
public void detach(DistributedClient obj) throws RemoteException
{
clients.remove(obj);
}
}
客户端回调接口
package com.tx.distributed;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Date;
public interface DistributedClient extends Remote {
public void update(Date d) throws RemoteException;
}
客户端
定义服务器端接口,跟服务器端接口一样
package com.tx.distributed;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface TimeGenerator extends Remote {
java.util.Date getCurrentTime() throws RemoteException;
String sayHello() throws RemoteException;
void attach(DistributedClient obj, long d) throws RemoteException;
void detach(DistributedClient obj) throws RemoteException;
}
模拟时钟客户端定义了回调函数的操作
package com.tx.distributed;
import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Date;
public class AnalogueClock extends UnicastRemoteObject implements Serializable,
DistributedClient {
protected AnalogueClock() throws RemoteException {
super();
}
/**
*
*/
private static final long serialVersionUID = -3432644283769542956L;
@Override
public void update(Date d) throws RemoteException
{
System.out.println("Analogue: " + d);
}
}
实验
package com.tx.distributed;
import java.rmi.NotBoundException;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Date;
public class Test {
/**
* @param args
*/
public static void main(String[] args)
{
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager() {
@Override
public void checkConnect(String host, int port)
{
}
@Override
public void checkConnect(String host, int port, Object context)
{
}
});
}
try {
String name = "TimeGenerator";
Registry registry = LocateRegistry.getRegistry("114.212.81.47");
TimeGenerator timeGenerator = (TimeGenerator) registry.lookup(name);
Date date = timeGenerator.getCurrentTime();
System.out.println("Current time: " + date);
AnalogueClock analogueClock = new AnalogueClock();
DigitalClock digitalClock = new DigitalClock();
timeGenerator.attach(analogueClock, 3600000);
timeGenerator.attach(digitalClock, 3600000 * 2);
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
}
No comments:
Post a Comment