现在的位置: 首页 > 综合 > 正文

java RMI(java远程方法调用实例解析)

2013年09月09日 ⁄ 综合 ⁄ 共 1950字 ⁄ 字号 评论关闭

在 Java 中,远程对象是实现远程接口的类的实例, 远程接口声明每个要远程调用的方法。在需要创建一个远程对象的时候,我们通过传递一个接口来隐藏基层的实施细节,客户通过接口句柄发送消息即可。 

远程接口具有如下特点: 
1) 远程接口必须为public属性。如果不这样,除非客户端与远程接口在同一个包内,否则 当试图装入实现该远程接口的远程对象时,调用会得到错误结果。 
2) 远程接口必须扩展接口java.rmi.Remote。 
3) 除与应用程序本身特定的例外之外,远程接口中的每个方法都必须在自己的throws从句中 声明java.rmi.RemoteException。(或RemoteException 的父类)。 

4) 作为参数或返回值传递的一个远程对象(不管是直接,还是本地对象中嵌入)必须声明为远 程接口,而不应声明为实施类。  

例如:

1)创建远程接口TestRemote.java,源代码如下:

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface TestRemote extends Remote {
public int add(int a, int b) throws RemoteException;   
}

2)创建远程接口的实现类TestRemoteImpl.java,源代码如下:

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class TestRemoteImpl extends UnicastRemoteObject implements TestRemote {
protected TestRemoteImpl() throws RemoteException {
super();
}

public int add(int a, int b) throws RemoteException {
return a+b;
}
}

3)编写服务器端代码Server.java,源代码如下:

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

public class Server {   
    public static void main(String[] args) throws Exception {   
        try {   
         LocateRegistry.createRegistry(8808) ;
            // 创建远程对象   
            TestRemote testRemote = new TestRemoteImpl();   
            // 奖名称绑定到对象   
            Naming.rebind("rmi://localhost:8808/server", testRemote);   
            System.out.println("RMI服务器正在运行。。。。。。");   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }   
}  

4)编写客户端代码 Client.java,源代码如下:

import java.rmi.Naming;

public class Client {
public static void main(String[] args) {
try {   
            String url = "rmi://localhost:8808/server";   
            TestRemote RmiObject = (TestRemote)Naming.lookup(url);   
            System.out.println(" 1 + 2 = " + RmiObject.add(1, 2) );   
         } catch (Exception exc) {   
             System.out.println("Error in lookup: " + exc.toString());   
         } 
}
}

5)编译源代码:

javac Server.java

javac Client.java

6)为远程对象实现创建根和干:  

要创建存根程序和骨架文件,应以包含远程对象实现的已编译类包全名运行 rmic 编译器。   

存根(Stub)是远程对象在客户端的代理,它将RMI调用传递给服务器端的骨架(Skeleton),后者负责将该调用传递给实际的远程方法,

输入如下:   

rmic -d E:\rmi TestRemoteImpl 

其中;E:\rmi是代码保存的位置。

7)运行服务器端程序和客户端程序:

java Server

java Client

抱歉!评论已关闭.