分享

RMI-Java远程方法调用的实现(二)

 平平凤凤 2010-11-02
四、一个简单RMI应用的实现一个正常工作的RMI系统由下面几个部分组成:●   远程服务的接口定义●   远程服务接口的具体实现●   桩(Stub)和框架(Skeleton)文件●   一个运行远程服务的服务器●   一个RMI命名服务,它允许客户端去发现这个远程服务●   类文件的提供者(一个HTTP或者FTP服务器)●   一个需要这个远程服务的客户端程序 1、远程服务的接口定义   RMI对接口有着强烈的依赖。在需要创建一个远程对象的时候,我们通过传递一个接口来隐藏基层的实施细节。所以客户得到远程对象的一个句柄正好同一些本地的根代码连接,有后者负责通过网络通信。但我们并不关心这些事情,通过自己的接口句柄发送消息即可。   创建一个远程接口时,必须遵守下列规则:1)、远程接口必须为public属性(不能有“包访问”;也就是说,他不能是“友好的”)。否则,一旦客户试图装载一个实现了远程接口的远程对象,就会得到一个错误。、2)、远程接口必须扩展接口java.rmi.Remote。3)、除与应用程序本身有关的违例,远程接口中的每个方法都必须在自己的throws从句中声明java.rmi.RemoteException.4)、作为参数或返回值传递的一个远程对象(不管是直接,还是本地对象中嵌入)必须声明为远程接口,不可声明为实施类。第一步就是建立和编译服务接口的Java代码。这个接口定义了所有的提供远程服务的功能://Calculator.java//define the interfaceimport 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异常对象。 2、远程服务接口的具体实现第二步,对远程服务接口的具体实现,这是一个CalculatorImpl类文件://CalculatorImpl.java//Implementationimport java.rmi.server.UnicastRemoteObjectpublic class CalculatorImpl extends UnicastRemoteObject implements Calculator {    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的连接和远程对象的初始化。 3、桩(Stubs)和框架(Skeletons)接下来就是要使用RMI编译器rmic来生成桩和框架文件,这个编译运行在远程服务实现类文件上。>rmic CalculatorImpl在相关目录下运行上面的命令,成功执行完上面的命令将会发现一个Calculator_stub.class文件,如果使用的Java2SDK,那么还可以发现Calculator_Skel.class文件。|||  4、主机服务器远程RMI服务必须是在一个服务器中运行的。下面定义的CalculatorServer类是一个非常简单的服务器。//CalculatorServer.javaimport 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、客户端客户端源代码//CalculatorClient.javaimport 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");      Syst四、一个简单RMI应用的实现一个正常工作的RMI系统由下面几个部分组成:●   远程服务的接口定义●   远程服务接口的具体实现●   桩(Stub)和框架(Skeleton)文件●   一个运行远程服务的服务器●   一个RMI命名服务,它允许客户端去发现这个远程服务●   类文件的提供者(一个HTTP或者FTP服务器)●   一个需要这个远程服务的客户端程序 1、远程服务的接口定义   RMI对接口有着强烈的依赖。在需要创建一个远程对象的时候,我们通过传递一个接口来隐藏基层的实施细节。所以客户得到远程对象的一个句柄正好同一些本地的根代码连接,有后者负责通过网络通信。但我们并不关心这些事情,通过自己的接口句柄发送消息即可。   创建一个远程接口时,必须遵守下列规则:1)、远程接口必须为public属性(不能有“包访问”;也就是说,他不能是“友好的”)。否则,一旦客户试图装载一个实现了远程接口的远程对象,就会得到一个错误。、2)、远程接口必须扩展接口java.rmi.Remote。3)、除与应用程序本身有关的违例,远程接口中的每个方法都必须在自己的throws从句中声明java.rmi.RemoteException.4)、作为参数或返回值传递的一个远程对象(不管是直接,还是本地对象中嵌入)必须声明为远程接口,不可声明为实施类。第一步就是建立和编译服务接口的Java代码。这个接口定义了所有的提供远程服务的功能://Calculator.java//define the interfaceimport 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异常对象。 2、远程服务接口的具体实现第二步,对远程服务接口的具体实现,这是一个CalculatorImpl类文件://CalculatorImpl.java//Implementationimport java.rmi.server.UnicastRemoteObjectpublic class CalculatorImpl extends UnicastRemoteObject implements Calculator {    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的连接和远程对象的初始化。 3、桩(Stubs)和框架(Skeletons)接下来就是要使用RMI编译器rmic来生成桩和框架文件,这个编译运行在远程服务实现类文件上。>rmic CalculatorImpl在相关目录下运行上面的命令,成功执行完上面的命令将会发现一个Calculator_stub.class文件,如果使用的Java2SDK,那么还可以发现Calculator_Skel.class文件。|||  4、主机服务器远程RMI服务必须是在一个服务器中运行的。下面定义的CalculatorServer类是一个非常简单的服务器。//CalculatorServer.javaimport 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、客户端客户端源代码//CalculatorClient.javaimport 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。1、首先运行注册程序RMIRegistry:>rmiregistry2、在第二个控制台里,运行服务器CalculatorService,因为RMI的安全机制将在服务端发生作用,所以必须增加一条安全策略。以下是对应安全策略的例子 grant {permission java.security.AllPermission "", "";};注意:这是一条最简单的安全策略,它允许任何人做任何事,对于更加关键性的应用,你必须指定更加详细安全策略。现在为了运行服务端,需要除客户类(CalculatorClient.class)之外的所有的类文件。确认安全策略在policy.txt文件之后,使用如下命令来运行服务器。> java -Djava.security.policy=policy.txt CalculatorServer这个服务器就开始工作了,把接口的实现加载到内存等待客户端的联接。3、现在切换到第三个控制台,启动客户端。为了在其他的机器运行客户端程序需要一个远程接口(Calculator.class) 和一个stub(CalculatorImpl_Stub.class)。 使用如下命令运行客户端prompt> java -Djava.security.policy=policy.txt CalculatorClient  五、结束语RMI为真正面向对象的分布式计算提供了可靠的平台。 您可使用RMI连接到Java组件,或用其它语言编写的现有 的组件。随着Java在您的环境中所具备的重要性的日益 增加,您还可扩大Java的使用范围,并获得所有的好处 --无需移植、低维护成本和安全而保密的环境。RMI为您 提供了循序渐进地将Java扩展到您的系统所有部分的平 台,您可根据需要适时地添加Java服务器和客户机。只 要您添加了Java,那么它所有的好处都会随之而来。RMI 则使之更简单、保密和强大em.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。1、首先运行注册程序RMIRegistry:>rmiregistry2、在第二个控制台里,运行服务器CalculatorService,因为RMI的安全机制将在服务端发生作用,所以必须增加一条安全策略。以下是对应安全策略的例子 grant {permission java.security.AllPermission "", "";};注意:这是一条最简单的安全策略,它允许任何人做任何事,对于更加关键性的应用,你必须指定更加详细安全策略。现在为了运行服务端,需要除客户类(CalculatorClient.class)之外的所有的类文件。确认安全策略在policy.txt文件之后,使用如下命令来运行服务器。> java -Djava.security.policy=policy.txt CalculatorServer这个服务器就开始工作了,把接口的实现加载到内存等待客户端的联接。3、现在切换到第三个控制台,启动客户端。为了在其他的机器运行客户端程序需要一个远程接口(Calculator.class) 和一个stub(CalculatorImpl_Stub.class)。 使用如下命令运行客户端prompt> java -Djava.security.policy=policy.txt CalculatorClient  五、结束语RMI为真正面向对象的分布式计算提供了可靠的平台。 您可使用RMI连接到Java组件,或用其它语言编写的现有 的组件。随着Java在您的环境中所具备的重要性的日益 增加,您还可扩大Java的使用范围,并获得所有的好处 --无需移植、低维护成本和安全而保密的环境。RMI为您 提供了循序渐进地将Java扩展到您的系统所有部分的平 台,您可根据需要适时地添加Java服务器和客户机。只 要您添加了Java,那么它所有的好处都会随之而来。RMI 则使之更简单、保密和强大

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多