Wednesday, November 21, 2012

要把第一次实现RMI的过程记录下来

服务器端
定义 客户端要访问的接口
 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