副标题#e#
RMI,长途要领挪用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是成立漫衍式Java应用措施的利便途径。RMI长短常容易利用的,可是它很是的强大。
RMI的基本是接口,RMI构架基于一个重要的道理:界说接口和界说接口的详细实现是分隔的。下面我们通过详细的例子,成立一个简朴的长途计较处事和利用它的客户措施
一个正常事情的RMI系统由下面几个部门构成:
● 长途处事的接口界说
● 长途处事接口的详细实现
● 桩(Stub)和框架(Skeleton)文件
● 一个运行长途处事的处事器
● 一个RMI定名处事,它答允客户端去发明这个长途处事
● 类文件的提供者(一个HTTP可能FTP处事器)
● 一个需要这个长途处事的客户端措施
下面我们一步一步成立一个简朴的RMI系统。首先在你的呆板里成立一个新的文件夹,以便安排我们建设的文件,为了简朴起见,我们只利用一个文件夹存放客户端和处事端代码,而且在同一个目次下运行处事端和客户端。
假如所有的RMI文件都已经设计好了,那么你需要下面的几个步调去生成你的系统:
1、编写而且编译接口的Java代码
2、编写而且编译接话柄现的Java代码
3、从接话柄现类中生成桩(Stub)和框架(Skeleton)类文件
4、编写长途处事的主运行措施
5、编写RMI的客户端措施
6、安装而且运行RMI系统
1、 接口
第一步就是成立和编译处事接口的Java代码。这个接口界说了所有的提供长途处事的成果,下面是源措施:
//Calculator.java//define the interface
import java.rmi.Remote;
public interface Calculator extends Remote{
public long add(long a, long b) throws java.rmi.RemoteException;
public long sub(long a, long b) throws java.rmi.RemoteException;
public long mul(long a, long b) throws java.rmi.RemoteException;
public long div(long a, long b) throws java.rmi.RemoteException;
}
留意,这个接口担任自Remote,每一个界说的要领都必需抛出一个RemoteException异常工具。
成立这个文件,把它存放在适才的目次下,而且编译。
>javac Calculator.java
2、 接口的详细实现
下一步,我们就要写长途处事的详细实现,这是一个CalculatorImpl类文件:
//CalculatorImpl.java
//Implementation
import java.rmi.server.UnicastRemoteObject
public class CalculatorImpl extends UnicastRemoteObject implements Calculator {
// 这个实现必需有一个显式的结构函数,而且要抛出一个RemoteException异常
public CalculatorImpl() throws java.rmi.RemoteException {
super();
}
public long add(long a, long b) throws java.rmi.RemoteException {
return a + b;
}
public long sub(long a, long b) throws java.rmi.RemoteException {
return a - b;
}
public long mul(long a, long b) throws java.rmi.RemoteException {
return a * b;
}
public long div(long a, long b) throws java.rmi.RemoteException {
return a / b;
}
}
同样的,把这个文件生存在你的目次里然后编译他。
这个实现类利用了UnicastRemoteObject去联接RMI系统。
在我们的例子中,我们是直接的从UnicastRemoteObject这个类上担任的,事实上并不必然要这样做,
假如一个类不是从UnicastRmeoteObject上担任,那必需利用它的exportObject()要领去联接到RMI。
假如一个类担任自UnicastRemoteObject,那么它必需提供一个结构函数而且声明抛出一个RemoteException工具。
当这个结构函数挪用了super(),它久激活UnicastRemoteObject中的代码完成RMI的毗连和长途工具的初始化。
#p#副标题#e#
3、 桩(Stubs)和框架(Skeletons)
下一步就是要利用RMI编译器rmic来生成桩和框架文件,这个编译运行在长途处事实现类文件上。
>rmic CalculatorImpl
在你的目次下运行上面的呼吁,乐成执行完上面的呼吁你可以发明一个Calculator_stub.class文件,
假如你是利用的Java2SDK,那么你还可以发明Calculator_Skel.class文件。
4、 主机处事器
长途RMI处事必需是在一个处事器中运行的。CalculatorServer类是一个很是简朴的处事器。
//CalculatorServer.java
import java.rmi.Naming;
public class CalculatorServer {
public CalculatorServer() {
try {
Calculator c = new CalculatorImpl();
Naming.rebind("rmi://localhost:1099/CalculatorService", c);
} catch (Exception e) {
System.out.println("Trouble: " + e);
}
}
public static void main(String args[]) {
new CalculatorServer();
}}
成立这个处事器措施,然后生存到你的目次下,而且编译它。
5、 客户端
客户端源代码如下:
#p#分页标题#e#
//CalculatorClient.java
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;
public class CalculatorClient {
public static void main(String[] args) {
try {
Calculator c = (Calculator)Naming.lookup( "rmi://localhost/CalculatorService");
System.out.println( c.sub(4, 3) );
System.out.println( c.add(4, 5) );
System.out.println( c.mul(3, 6) );
System.out.println( c.div(9, 3) );
}
catch (MalformedURLException murle) {
System.out.println();
System.out.println("MalformedURLException");
System.out.println(murle);
}
catch (RemoteException re) {
System.out.println();
System.out.println("RemoteException");
System.out.println(re);
}
catch (NotBoundException nbe) {
System.out.println();
System.out.println("NotBoundException");
System.out.println(nbe);
}
catch ( java.lang.ArithmeticException ae) {
System.out.println();
System.out.println("java.lang.ArithmeticException");
System.out.println(ae);
}
} }
生存这个客户端措施到你的目次下(留意这个目次是一开始成立谁人,所有的我们的文件都在谁人目次下),而且编译他。
6、 运行RMI系统
此刻我们成立了所有运行这个简朴RMI系统所需的文件,此刻我们终于可以运行这个RMI系统啦!来享受吧。
我们是在呼吁节制台下运行这个系统的,你必需开启三个节制台窗口,一个运行处事器,一个运行客户端,尚有一个运行RMIRegistry。
首先运行注册措施RMIRegistry,你必需在包括你刚写的类的那么目次下运行这个注册措施。
>rmiregistry
好,这个呼吁乐成的话,注册措施已经开始运行了,不要管他,此刻切换到别的一个节制台,在第二个节制台里,我们运行处事器CalculatorService,输入如下呼吁:
>java CalculatorServer
这个处事器就开始事情了,把接口的实现加载到内存期待客户端的联接。好此刻切换到第三个节制台,启动我们的客户端。
>java CalculatorClient
假如所有的这些都乐成运行,你应该看到下面的输出:
1 9 18 3
假如你看到了上面的输出,恭喜你,你乐成了,你已经乐成的建设了一个RMI系统,而且使他正确事情了。纵然你运行在同一个计较机上,RMI照旧利用了你的网络仓库和TCP/IP去举办通讯,而且是运行在三个差异的Java虚拟机上。这已经是一个完整的RMI系统。