一个简单的RMI程序

经过两天的调试一个非常简单的rmi demo终于可以在一台机器上调用成功了。下面仔细回顾一下。

RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。下面我们通过具体的例子,建立一个简单的远程计算服务和使用它的客户程序

一个正常工作的RMI系统由下面几个部分组成:

# 远程服务的接口定义
# 远程服务接口的具体实现
# Stub 和 Skeleton 文件
# 一个运行远程服务的服务器
# 一个RMI命名服务,它允许客户端去发现这个远程服务
# 类文件的提供者(一个HTTP或者FTP服务器)
# 一个需要这个远程服务的客户端程序

下面我们一步一步建立一个简单的RMI系统。首先在你的机器里建立一个新的文件夹,以便放置我们创建的文件,为了简单起见,我们只使用一个文件夹存放客户端和服务端代码,并且在同一个目录下运行服务端和客户端。

如果所有的RMI文件都已经设计好了,那么你需要下面的几个步骤去生成你的系统:

1、  编写并且编译接口的Java代码
2、  编写并且编译接口实现的Java代码
3、  从接口实现类中生成 Stub 和 Skeleton 类文件
4、  编写远程服务的主运行程序
5、  编写RMI的客户端程序
6、  安装并且运行RMI系统

1.编写并且编译接口的Java代码
package test;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface PerfectTimeI extends Remote{
    long getPerfectTime() throws RemoteException;
}
注释:
  在这个接口里面要继承Remote接口,每个方法都要抛出RemoteException;



2.编写并且编译接口实现的Java代码
//PerfectTime.java
//The implementation of the PerfectTime remote object
package test;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class PerfectTime extends UnicastRemoteObject implements PerfectTimeI {
  private static final long serialVersionUID = 1L;

    public PerfectTime() throws RemoteException {
    }

    public long getPerfectTime() throws RemoteException {
        return System.currentTimeMillis();
    }
}
注释:
  这个类是接口的实现类。
  需要实现PerfectTimeI接口并且要继承 UnicastRemoteObject。
  需要写一个无参数的构造函数,使他抛出RemoteException。



3.从接口实现类中生成 Stub 和 Skeleton 类文件
javac test\PerfectTimeI.java
javac test\PerfectTime.java
rmic  test.PerfectTime

4.编写远程服务的主运行程序
package test;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class PerfectServer {
    public static void main(String[] args) {

        PerfectTimeI pt;
        try {
            pt = new PerfectTime();
            Registry memberRegistry=LocateRegistry.createRegistry(10088);
            System.out.println(pt.getPerfectTime());
            memberRegistry.bind("PerfectTime", pt);
            System.out.print("ok");
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (AlreadyBoundException e) {
            e.printStackTrace();
        }

    }
}
注释:
  这里主要是设定绑定
  首先应该Registry memberRegistry=LocateRegistry.createRegistry(10088);设定程序监听端口;
  再进行绑定memberRegistry.bind("PerfectTime", pt);
 

5.编写RMI的客户端程序
package test;

import java.rmi.Naming;

public class DisplayPerfectTime {
    /** * DisplayPerfectTime 构造子注解。 */
    public DisplayPerfectTime() {
        super();
    }

    public static void main(String[] args) {

        try {
            PerfectTimeI t = (PerfectTimeI) Naming.lookup("rmi://192.168.1.100:10088/PerfectTime");
          for (int i = 0; i < 10; i++) {
                System.out.println("PerfectTime:" + t.getPerfectTime());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
注释:
  1.Naming.lookup("rmi://192.168.1.100:10088/PerfectTime");返回的是一个PerfectTime_stub他的类型是PerfectTimeI
  2.这个lookup的url是rmi://192.168.1.100:10088/PerfectTime
    rmi://ip address:port/binding_name


6、  安装并且运行RMI系统
java test.PerfectServer //运行服务器端


//编译客户端并运行ta
javac test\DisplayPerfectTime.java
java test.DisplayPerfectTime

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值