经过两天的调试一个非常简单的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
一个简单的RMI程序
最新推荐文章于 2021-02-16 01:36:02 发布