基础知识
分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。 常见的分布式技术有:CORBA、DCOM和RMI。
其中,面向对象的远程方法调用(Remote Method Invocation,RMI)是Enterprise JavaBeans的支柱技术,是建立分布式Java应用程序的方便途径。RMI是Java的一组开发分布式应用程序的API,它使用Java语言接口定义了远程对象,集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。
通过RMI技术,使原先的程序在同一操作系统的方法调用,变成了不同操作系统之间程序的方法调用。由于J2EE是分布式程序平台,它的RMI机制允许程序组件在不同操作系统之间的通信。比如,一个EJB可以通过RMI调用Web上另一台机器上的EJB远程方法。
在与远程对象的通信过程中,RMI使用标准机制:桩stub和架构skeleton。桩和架构是应用程序与系统其他部分的接口,它们使用RMI的rmic编译器产生。桩通常负责:初始化远程调用、序列化、远程方法调用、反序列化、远程方法调用完成等;构架负责:反序列化客户端参数、调用实际远程对象、序列化返回客户端参数。
RMI:面向对象的远程方法调用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。
开发工具包包括:
l java.rmi 客户端的rmi类,接口和异常
l java.rmi.sever 服务器端的rmi类,接口和异常
l java.rmi.registry 用于管理rmi命名服务的类
l java.rmi.dgc 用于管理分布式垃圾收集的类
l java.rmi.activation 用于按需激活的rmi服务的类
应用工具有:
n Rmic.exe 编译器,生成stub和skeleton
n rmiregistry.exe 为rmi提供命名服务的服务器,这项服务把名字和对象关联在一起
n rmid.exe 支持rmi激活框架的服务器
RMI实现流程
1、生成一个远程接口。所有的远程服务都需要继承Remote接口,该接口是一个不定义方法的标记接口,其全部内容只有一行public interface Remote{ }。
2、实现远程对象(服务器端程序) ,该类需要继承UnicastRemoteObject,并实现远程服务接口,而且还要使用RMISecurityManager;
3、生成桩程序和架构(服务器端程序) ;
4、编写服务器程序;
5、编写客户程序;
6、注册远程对象;
7、启动远程对象。
RMI在Windows下运行步骤,一共分为5步,分别是:
1.进入命令行窗口,进入自己项目的文件夹内
javac *.java
2.使用rmic serverName
产生serverName_Stub.class的文件
3.使用start rmiregistry [port]
4.输入java -Djava.security.policy=policyName serverName 运行服务器
5.如果成功另外打开一个命令行窗口进入自己项目文件夹
输入 java -Djava.security.policy=policyName clientName
(注意,有的时候要在后面加上参数localhost)
在RMI中,策略文件是一个文本文件,里面记录了一些对计算机资源访问的方式;比如对本地文件的访问控制,对端口的访问控制等。其文件后缀名为”*.policy”。系统策略文件的缺省位置为:java_jre.home/lib/security/java.policy (Solaris) ,java_jre.home\lib\security\java.policy (Windows) ,其格式为:
grant {
permission java.net.SocketPermission "*:1024-65535", "connect,accept";
permission java.net.SocketPermission "*:80","connect";};
为了差别不同的安全策略,可建立自己的策略文件,如c:\MyPolicy.policy ,假设运行本地的TCP 2005端口可以连接、接受连接和解析,则内容为:
grant {
permission java.net.SocketPermission "localhost:2005","connect,accept,resolve";}
当运行RMI服务器程序时,指定了安全策略文件
java -Djava.security.policy=c:\MyPolicy.policy rmiServer
代码示例
编写RMI基础
//实现一个Remote接口
import java.rmi.*;
public interface Arith extends java.rmi.Remote{
int [] add(int a[], int b[])throws java.rmi.RemoteException;
}
远程接口定义说明了服务器提供的方法特性,包含了方法的名字和参数。这样的接口必备的特性:
l 必须声明为public
l 必须extends java.rmi.Remote接口
异常处理时,必须throws java.rmi.RemoteException
客户端:
1 //客户端,访问指定的服务器端 2 import java.rmi.*; 3 import java.net.*; 4 5 public class ArithApp{ 6 public static void main(String [] argv){ 7 int a[] = {1,2,3,4,5,6,7,8,9,10}; //需要累加的数据 8 int b[] = {1,2,3,4,5,6,7,8,9,10}; 9 10 int result [] = new int[10]; 11 12 try{ 13 Arith obj=(Arith)Naming.lookup("//localhost:3000/ArithServer"); //查找指定服务 14 result = obj.add(a,b); //调用RMI服务 15 }catch(Exception e){ 16 System.out.println("ArithServer error" + e.getMessage()); 17 e.printStackTrace(); 18 } 19 20 System.out.print("The sum="); 21 for(int i=0;i<result.length;i++){ 22 System.out.println(result[i] + ""); 23 } 24 System.out.println(); 25 } 26 } 27 要运行这个程序,简单的方法是修改Java_JRE\lib\security\java.policy的内容 28 找到 grant{ 29 在接下来的第一行添加以下语句,取消所有的安全限制。 30 permission java.security.AllPermission;