2011-12-20 58 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