RMI(Remote Method Invocation):远程方法调用
RMI是Enterprise JavaBean的支柱;其设计基础是
接口,它的架构基于一个重要的原理:
定义接口和定义接口的实现是分开的
一个正常的RMI系统组成部分,如下:
1、远程服务的接口定义
2、远程服务接口的具体实现
3、桩(stub)和框架(skeleton)文件的生成--->rmic命令的使用
4、一个RMI的命名服务,它允许远程调用的客户端去发现该服务
5、类文件的提供者(HTTP或FTP服务)
6、远程调用该服务的客户端
根据上述的简要说明,编写一个简单的RMI形式的calculator系统,实现远程调用加减乘除四种基本运算,let's go
1、定义远程服务的接口(Calculator)
|-该接口声明四个方法,分别是:add()、sub()、mul()、div()
|-该接口需要继承Remote,而且每个方法都必须抛出一个RemoteException的异常
具体代码如下:
pubilc interface Calculator extends Remote
{
public long add(long a,long b) throws RemoteException;
public long sub(long a,long b) throws RemoteException;
public long mul(long a,long b) throws RemoteException;
public long div(long a,long b) throws RemoteException;
}
2、远程服务接口的具体实现
|-继承UnicastRemoteObject,必须提供一个构造函数而且抛出一个RemoteException对象,当这个构造函数调用super()时,它就会激活UnicastRemoteObject中的代码完成RMI的连接和远程对象的初始化
|-如果一个类不是从UnicastRemoteObject上继承,则必须使用它的exportObject()方法去联接到RMI
使用继承UncastRemoteObject类来实现该服务接口,具体代码如下
public CalculatorImpl implements Calculator extends UnicastRemoteObject
{
public Calculator() throws RemoteException
{
super();
}
public long add(long a,long b) throws RemoteException
{
return a+b;
}
public long sub(long a,long b) throws RemoteException
{
return a-b;
}
public long mul(long a,long b) throws RemoteException
{
return a*b;
}
public long div(long a,long b) throws RemoteException
{
return a/b;
}
}
3、使用javac命令编译远程服务接口类和远程服务接口具体实现类
4、生成桩(stub)和框架(skeleton)文件
|-使用rmic编译刚刚编译了的远程服务接口具体的实现类
|-编译完在classes下会生成了一个CalculatorImpl_Stub.class文件
5、编写远程主机服务器
|-远程RMI服务必须在一个服务器中运行
具体代码如下
public class Server
{
public Server()
{
try
{
Calculator cal = new CalculatorImpl();
Naming.rebind("rmi://localhost:1099/Service",cal);
}
catch (Exception e)
{
System.out.println("访问时出现以下的错误:"+e);
}
}
public static void main(String[] args)
{
new Server();
}
}
6、编写远程调用的客户端
具体代码如下
public class Client
{
public static void main(String[] args)
{
try
{
CalculatorInterface cal = (CalculatorInterface)Naming.lookup("rmi://localhost/Service");
System.out.println(cal.add(3,4));
System.out.println(cal.sub(3,4));
System.out.println(cal.mul(3,4));
System.out.println(cal.div(12,4));
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
7、运行测试,具体步骤
|-启动RMI注册(Registry)程序,使用
start rmiregistry启动注册表服务器
|-启动远程服务器
java Server
|-启动远程调用客户端
java Client
RMI通过上面的7个步骤基本上可以实现,希望通过代码的具体演示可以为更多人对RMI有初步的了解,写得不足之处望多多指导,同时也要多多支持与交流