2011-12-20 57 views
0

我在远程方法调用期间对呼叫序列有许多疑问。 以下是我读取的4个无错误代码片段,了解RMI。了解RMI期间的呼叫序列

1)INTERFACE

import java.rmi.*; 

public interface AddServerIntf extends Remote { 
    double add(double d1, double d2) throws RemoteException; 
} 

2.)实施

import java.rmi.*; 
import java.rmi.server.*; 

public class AddServerImpl extends UnicastRemoteObject implements AddServerIntf { 
public AddServerImpl() throws RemoteException {} // what is it meant for ? 

public double add(double d1 , double d2) throws RemoteException { 
     return d1 + d2; 
} 
} 

3.)AddServer类

import java.net.*; 
import java.rmi.*; 

    public class AddServer { 
    public static void main(String args[]) { 
    try { 
     AddServerImpl addServerImpl = new AddServerImpl(); 
     Naming.rebind("AddServer",addServerImpl); // what does it do and how ? 
    } catch(Exception exc) { 
     System.out.println("Exception : " + exc); 
     } 
    } 
    } 

4.)了addClient类

import java.rmi.*; 

public class AddClient { 
    public static void main(String args[]) { 
    try { 
     String addServerURL = "rmi://" + args[0] + "/AddServer"; 
     AddServerIntf addServerIntf = (AddServerIntf)Naming.lookup(addServerURL); // how does it look up and how does it return ? 
     System.out.println("The first number is : " + args[1]); 
     double d1 = Double.valueOf(args[1]).doubleValue(); 
     System.out.println("The second number is : " + args[2]); 
     double d2 = Double.valueOf(args[2]).doubleValue(); 
     System.out.println("The sum is : " + addServerIntf.add(d1,d2)); // what does it mean to call the method of an interface ? 

    } catch(Exception exc) { 
     System.out.println(exc); 
     } 
    } 
} 

文件服务器计算机上:AddServer.class,AddServerImpl.class,AddServerImpl_Stub.class,AddServerIntf.class

文件客户机上:AddServerIntf.class ,AddClient.class,AddServerImpl_Stub.class

将上述文件保留在各自的位置后,我开始rmiregistry在服务器上,然后使用java AddServer启动服务器,然后使用java 127.0.0.1 20 30

启动客户端一旦客户端启动这句话是什么(AddServerIntf)Naming.lookup(addServerURL);代码AddClient吗?

客户端程序开始执行时执行的例程是什么?它是如何返还的?

这个陈述在AddServer中做了什么?

最后,当我打电话来使用addServerIntf.add(d1,d2)获取总和时,它是什么意思(调用接口的方法)?为什么我要调用接口的方法?那是什么?

我无法理解RMI的机制,谁调用谁和如何?

+0

@voterToClose我问过上面的代码是如何工作的?将结果w.r.t返回给上述代码涉及哪些步骤? – 2011-12-20 15:12:42

+0

我根据反馈更新了我的答案。 – Santosh 2011-12-21 13:15:08

+0

如果我的更新回复解决您的问题,请让我来! – Santosh 2011-12-27 13:10:48

回答

-2

RMI:远程方法调用

通常当我们说我调用一个方法时,我们隐含地认为类的方法与调用类在同一个JVM中加载。 RMI可以让你做同样的事情,但调用方法和被调用者在不同的JVM中(通常在两台不同的物理机器上)。

在一个典型的RMI有两个部分:

  1. 客户:专门招待客户端的调用对象:它要求
  2. 服务器的对象。

在逐一回答您的问题之前,以下是典型的客户端服务器通信(高级别)的情况。

服务器启动

  • 注册远程(AddServerImpl)对象以它的注册表。
  • 开始向一个港口倾斜(标准999)。

客户端调用远程方法

  • 客户端将查询远程对象的服务器regitery((AddServerIntf)Naming.lookup(addServerURL)
  • Server返回远程存根(实现相同的接口的远程对象)
  • 客户端在存根上调用方法(addServerIntf.add(d1,d2))
  • 存根串行化(转换为可通过网络)输入((d1,d2))的格式,将它们作为请求传递给服务器。
  • 在服务器端,他的输入被反序列化(从通过网络收到的数据重新创建java对象),服务器在实际对象(AddServerImpl)上执行该方法。
  • 的方法输出(return d1 + d2)是由方法返回,服务器序列化输出并且将其作为响应调用客户端
  • 存根反序列化响应,你有输出!

我来回答你的问题

是什么代码AddClient声明(AddServerIntf)Naming.lookup(addServerURL);

- 这是请求服务器给予我们打算调用其方法的对象的远程引用。

是什么声明Naming.rebind("AddServer",addServerImpl);在类AddServer中做什么?

- 这是确保服务器知道(在它的注册表中添加),有名称为“AddServer”这样,每当有此对象的方法的调用请求时,它可以提供服务的对象。

当我调用获取使用addServerIntf.add(d1,d2)的总和,这是什么意思(调用接口的方法)?为什么我要调用接口的方法?那是什么?

- 一个接口是java机制,实现抽象。现在,当你调用一个接口时,就会调用一个实现相同接口的对象的方法(在这种情况下,远程调用服务器上的对象)。要回答“为什么”,抽象可以帮助您将使用和实现分开。所以调用者不需要知道实现的细节(),它只应该只关心输入和输出参数。

要回答你剩下的问题

哪些是正在开展的客户端程序开始执行时的程序?它是如何返还的?

- 有此背景,请参考this link。它已经以比我更好的方式解释:)。

+1

不是很清楚,有点不准确。自1998年以来,RMI骨架已经过时。绑定通过命名查找使存根可用于清理。远程接口的实例,因此调用接口意味着调用存根,存根调用远程对象。 '为什么'是因为客户端不具备远程对象,因为它是远程对象:它有一个存根对象,它实现了相同的远程接口。您发布的链接也存在问题,请查看信函。 – EJP 2011-12-20 21:55:41

+1

我也同意。我认为骨骼已经过时了,因为jdk1.2 – saplingPro 2011-12-21 05:18:50

+0

谢谢。我生活在一个古老的时代。这是我喜欢这个网站的。 – Santosh 2011-12-21 05:33:47