理解RMI期间的呼叫序列

时间:2011-12-20 13:55:46

标签: java network-programming rmi stub

我对远程方法调用期间的调用顺序有很多疑问。 以下是我读过的4个无错误的代码片段,用于理解 RMI。

1。)接口

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 Class

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 Class

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后会做什么?

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

语句Naming.rebind("AddServer",addServerImpl);在课程AddServer中的作用是什么?

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

我无法理解RMI的机制,谁叫谁以及如何?。

1 个答案:

答案 0 :(得分:-2)

RMI:远程方法调用

通常当我们说我调用一个方法时,我们隐式地假设一个类的方法在与调用类相同的JVM中加载。 RMI允许你做同样的事情,但调用方法和被调用者在不同的JVM中(通常在两个不同的物理机器上)。

在典型的RMI中有两部分:

  1. 客户端:调用
  2. 的对象
  3. 服务器:接受客户呼叫的对象。
  4. 在逐一回答您的问题之前,以下是典型的客户端服务器通信的发生方式(高级别)。

    服务器启动

    • 将远程(AddServerImpl)对象注册到其注册表。
    • 开始点亮端口(标准999)。

    客户端调用远程方法

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

    让我回答你的问题

    代码(AddServerIntf)Naming.lookup(addServerURL);中的AddClient语句是什么?

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

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

    - 这是为了确保服务器知道(在其注册表中添加)有一个名为" AddServer"的对象。因此,只要有请求调用此对象的方法,就可以提供它。

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

    - 接口是实现抽象的java机制。现在,当您调用接口时,会调用实现相同接口的对象的方法(在本例中为远程服务器上的对象)。为了回答“为什么”,抽象可以帮助您将使用和实施分开。因此调用者不需要知道implementation()的细节,它只应该只关心输入和输出参数。

    回答你剩下的问题

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

    - 目前为止,请参阅this link。它以比我更好的方式解释了:)。